Как я восстанавливал базу flowzr
Jan. 10th, 2015 05:28 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Последние несколько лет для учета расходов я использовал программу 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).
В итоге, после изучения схемы базы и извлечения недостающих данных, удалось собрать все в исправную базу. Сейчас она синхронизируется с облаком. Надеюсь что после этого ею наконец можно будет пользоваться на нескольких устройствах параллельно.
К счастью у меня было включено ежедневное резервное копирование базы, так что за несколько итераций восстановления данных удалось найти полностью исправную версию базы. Теперь оставалось понять как в эту исправную версию внести последние изменения. Первая мысль была редактировать резервные копии, но оказалось что формат представления данных в них несколько неудобен для быстрой ручной правки - хотя файл и текстовый, но содержит не строки 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).
В итоге, после изучения схемы базы и извлечения недостающих данных, удалось собрать все в исправную базу. Сейчас она синхронизируется с облаком. Надеюсь что после этого ею наконец можно будет пользоваться на нескольких устройствах параллельно.