Как да проверите за версия на база данни директно от .db файл

Имам дилема относно безплатно приложение, което позволявам на потребителите да импортират своите данни (sqlite файл на SD картата) в платено приложение.

След извършване на тези актуализации; Разбрах, че ако трябва да направя бъдещи промени в базата данни, потребителят ще трябва да импортира същата версия на DB (от безплатното приложение) в съществуващата версия (на платеното приложение).

Пример от реалния живот:

Да кажем, че версия 1 на двете приложения има 1 таблица с 5 колони. Правя надстройка до v2, сега таблицата 1 има 6 колони.

Когато потенциален потребител извърши импортиране в рамките на платеното приложение, за да въведе данни от безплатното приложение, има шанс безплатното приложение да бъде на DB версия 1 (ако потребителят не е актуализирал приложението наскоро), докато платеното приложение ще бъде търси DB версия 2. Предполагам, че това води до срив при стартиране.

Как мога да направя проверка като тази в платеното приложение, преди да направя импортиране: (псевдо код)

File olddb = oldDb.db; // get the back up file here from SD
int piadAppDBVersion = 2; // check for the current version of the database in paid app

if (olddb.getDatabaseVersion() == getPaidAppDBVersion()) { // made up functions
 // allow import;
} else {
 // Toast "Your databases are incompatible"
}

Така че двата въпроса: 1. Ако горният код е подходящо решение за осигуряване на съвместимост, как може да стане това? 2. Ако горното не е стандартно решение на моя проблем, тогава какво е?

Странична бележка: Моят импорт се състои от просто копиране на файл: копиране на резервна база данни във външно хранилище и презаписване на базата данни във вътрешно хранилище.


person TheLettuceMaster    schedule 13.08.2014    source източник
comment
Едно възможно решение е да пренасочите потребителя към магазина на Google Play, за да актуализирате безплатното приложение, преди да му позволите да стартира платеното приложение.   -  person Code-Apprentice    schedule 14.08.2014
comment
@user2864740 Това е много елегантно и просто решение според мен. Ще изчакам това известно време, за да видя дали първо ще се появят други отговори.   -  person TheLettuceMaster    schedule 14.08.2014


Отговори (1)


Помислете за версия или таблица с функции в базата данни на SQLite. Не се страхувайте да включите това като част от стабилна схема; много от моите схеми на бази данни съдържат дневници на приложени скриптови промени.

SQLite обаче поддържа PRAGMA user_version, който също може да се използва за тази цел, въпреки че може съхранява само една цяло число:

Прагмите schema_version и user_version се използват за задаване или получаване на стойността съответно на schema-version и user-version. Версията на схемата и версията на потребителя са 32-битови цели числа със знак, съхранени в заглавката на базата данни при отмествания 40 и 60, съответно.

Версията на схемата обикновено се манипулира само вътрешно от SQLite ..

Потребителската версия не се използва вътрешно от SQLite. Може да се използва от приложения за всякакви цели.

User_version PRAGMA се поддържа чрез стандартния Android SQLite API, който може да бъде достъпен с SQLiteDatabase.getVersion и setVersion; след отваряне на базата данни.

Вижте също Къде Android съхранява версията на базата данни на SQLite?

person user2864740    schedule 13.08.2014
comment
Това изглежда като добър план, но проблемът е, че ПЪРВО трябва да заменя текущата DB с резервната, за да проверя тази таблица. нали Ако е така, проблемът е, че ПЪРВО трябва да проверя версията на DB и след това, АКО са еднакви, да направя замяната (импортиране). Освен ако не знаете начин, по който можете да правите заявки за файл във външното хранилище (въпреки че самото приложение зарежда DB класа, използвайки текущата DB (от вътрешната) - ако това има смисъл?) - person TheLettuceMaster; 14.08.2014
comment
@KickingLettuce Можете да отворите различен файл с база данни (не съм сигурен дали се поддържа чрез външно хранилище, но няма причина да не може да има временна база данни за импортиране във вътрешното, оголено пространство); няма нужда да замените оригинала, докато новата база данни не бъде валидирана и не бъдат приложени всички трансформации на данни. - person user2864740; 14.08.2014