hedgeov: (Default)
[personal profile] hedgeov
Последние несколько лет для учета расходов я использовал программу Financisto. А в середине осени ушедшего года переключился на форк под названием Flowzr. Причин переключения было две: более новый интерфейс, основанный на стандартных виджетах Андроид 4 и возможность ведения базы с нескольких устройств. Эта совместная работа с базой основана на синхронизации данных через облако flowzr.com. Как я понимаю, оно максимально использует инфраструктуру google для работы с аккаунтами и совместного доступа к данным с разных Андроид-устройств. Особенности реализации таковы, что синхронизация работает достаточно медленно и за один заход синхронизировать всю базу не удавалось даже используя домашний Wi-Fi. Через несколько дней экспериментов я обнаружил, что список счетов и журнал транзакций содержат массу дубликатов, а дерево категорий "развалилось" - потомки потеряли предков, пара категорий пропала, но появилось несколько новых пустых категорий. Ужас в общем.

К счастью у меня было включено ежедневное резервное копирование базы, так что за несколько итераций восстановления данных удалось найти полностью исправную версию базы. Теперь оставалось понять как в эту исправную версию внести последние изменения. Первая мысль была редактировать резервные копии, но оказалось что формат представления данных в них несколько неудобен для быстрой ручной правки - хотя файл и текстовый, но содержит не строки sql-запросов а эдакие "параграфы" для каждой записи каждой таблицы. Причем, поскольку все в куче, схему базы не видно и на поиск нужных записей пришлось бы потратить существенное время. В результате несложных исследований оказалось, что financisto использует Sqlite. Дальше оставалось найти файл базы в телефоне (\data\data\com.flowzr\databases\financisto.db) и удобный редактор баз для PC под управлением Windows XP. От редактора требовалось умение открывать базу, показывать схему, выполнять sql-запросы, экспортировать и импортировать записи таблиц. Попробовав несколько разных редакторов я в итоге остановился на SQLite Studio - мне в нем больше всего понравилось как он умеет экспортировать данные в набор sql-запросов и как он показывает несколько одновременно открытых баз в одном окне.

Дальше выяснилось почему синхронизация рушила базу: у каждой записи есть поле "remote_key" в котором содержится уникальный идентификатор источника этой записи, связанный с гугло-аккаунтом. В ходе моих экспериментов с синхронизацией в некоторых записях оказался довольно странный идентификатор, не похожий на аккаунт. То ли мой косяк, то ли облачный сервис был еще не достаточно отлажен. Как результат, данные всегда считались новыми и всегда добавлялись в базу. Для решения проблемы значение поля было сброшено для всех записей всех таблиц. (Кстати надо заметить, что автор системы синхронизации не стал заморачиваться с отдельной таблицей для хранения этого идентификатора, а тупо добавляет его к каждой записи. Идентификатор это довольно длинная текстовая строка, так что после полной синхронизации размер базы увеличивается примерно в 2-2,5 раза. У меня он с ~3,5 мегабайт вырос до почти 10).

В итоге, после изучения схемы базы и извлечения недостающих данных, удалось собрать все в исправную базу. Сейчас она синхронизируется с облаком. Надеюсь что после этого ею наконец можно будет пользоваться на нескольких устройствах параллельно.
From:
Anonymous( )Anonymous This account has disabled anonymous posting.
OpenID( )OpenID You can comment on this post while signed in with an account from many other sites, once you have confirmed your email address. Sign in using OpenID.
User
Account name:
Password:
If you don't have an account you can create one now.
Subject:
HTML doesn't work in the subject.

Message:

 
Notice: This account is set to log the IP addresses of everyone who comments.
Links will be displayed as unclickable URLs to help prevent spam.

Profile

hedgeov: (Default)
hedgeov

April 2016

S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 20th, 2017 06:04 pm
Powered by Dreamwidth Studios