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

У меня есть дилемма относительно бесплатного приложения, которое я разрешаю пользователям импортировать свои данные (файл sqlite на SD-карте) в платное приложение.

После выполнения этих обновлений; Я понял, что если мне нужно будет внести изменения в базу данных в будущем, пользователю нужно будет импортировать ту же версию БД (из бесплатного приложения) в существующую версию (платного приложения).

Пример из реальной жизни:

Допустим, версия 1 обоих приложений имеет 1 таблицу с 5 столбцами. Я делаю обновление до v2, теперь 1 таблица имеет 6 столбцов.

Когда потенциальный пользователь выполняет импорт в платном приложении для переноса данных из бесплатного приложения, есть вероятность, что бесплатное приложение может находиться в БД версии 1 (если пользователь недавно не обновлял приложение), в то время как платное приложение будет ищу БД версии 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 user2864740 Это очень элегантное и простое решение, я думаю. Я дам этому некоторое время, чтобы увидеть, появятся ли какие-либо другие ответы в первую очередь.   -  person TheLettuceMaster    schedule 14.08.2014


Ответы (1)


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

Однако SQLite поддерживает PRAGMA user_version, который также может использоваться для этой цели, хотя и может хранить только одно целочисленное значение:

Прагмы schema_version и user_version используются для установки или получения значения версии схемы и версии пользователя соответственно. Версия схемы и версия пользователя — это 32-разрядные целые числа со знаком с обратным порядком байтов, хранящиеся в заголовке базы данных по смещениям 40 и 60 соответственно.

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

Пользовательская версия не используется внутри SQLite. Он может использоваться приложениями для любых целей.

PRAGMA user_version поддерживается через стандартный Android SQLite API, доступ к которому можно получить с помощью SQLiteDatabase.getVersion и setVersion; после открытия базы данных.

См. также Где Android хранит версию базы данных SQLite?

person user2864740    schedule 13.08.2014
comment
Это кажется хорошим планом, но проблема в том, что я должен СНАЧАЛА заменить текущую БД резервной копией, чтобы проверить эту таблицу. Верно? Если это так, проблема в том, что мне нужно сначала проверить версию БД, а затем, ЕСЛИ они совпадают, выполнить замену (импорт). Если вы не знаете, как вы можете выполнять запросы к файлу во внешнем хранилище (даже если само приложение загружает класс БД, используя текущую БД (из внутренней) - если это имеет смысл?) - person TheLettuceMaster; 14.08.2014
comment
@KickingLettuce Вы можете открыть другой файл базы данных (я не уверен, поддерживается ли он через внешнее хранилище, но нет причин, по которым не может быть временной базы данных для импорта во внутреннее открытое пространство); нет необходимости заменять оригинал, пока новая база данных не будет проверена и не будут применены какие-либо преобразования данных. - person user2864740; 14.08.2014