- Регистрация
- 1 Мар 2015
- Сообщения
- 1,481
- Баллы
- 155
Этот пост будет посвящен проблеме, с которой вы можете столкнуться при разработке приложения для Android, но вам необходимо обновить базу данных. Кажется простым, но вы заметите, что вашему пользователю может потребоваться удалить предыдущее приложение, чтобы использовать новую базу данных, и это не хорошо!
Ваш код обходит обычную структуру создания / обновления класса SQLiteOpenHelper, поэтому вам придется самостоятельно выполнять обновление. Вы можете просто удалить старый файл, переписав или введя команды SQL, если вам нужно сохранить данные.
Когда вам нужно перезаписать, вы должны перейти в меню Развертывание и убедиться, что опция Перезапись помечена как «Всегда», так как это значение по умолчанию. Плохо то, что по какой-то причине не работает должным образом
[если кто-то знает почему, дайте нам знать].
Итак, после установки приложения Android APK остается в папке / assets и (не скомпилированные исходные файлы, связанные с вашим проектом). Новый исполняемый файл (.so) будет извлечен из APK (Android Package - простой zip-файл), но / данные из вашего пакета не будут затронуты! Таким образом, вы должны сделать рутину, чтобы позаботиться об этом.
Я бы порекомендовал вам установить версию в вашей базе данных SQLite, выполнив команду pragma: PRAGMA user_version. По умолчанию возвращается 0 в качестве версии базы данных. Как только вы сделаете новое изменение в структуре, вызовите команду «PRAGMA user_version = #», пример: PRAGMA user_version = 3; это отметит базу данных.
Теперь вы можете сначала проверить версию пользовательской базы данных, если user_version совпадает с тем, что вы продолжаете, иначе код, приведенный ниже, сделает свое дело:
Включите модуль System.Zip и убедитесь, что ваша база данных ЗАКРЫТА, прежде чем вызывать подпрограмму. Вы можете расширить эту функцию, чтобы проверить прагму user_version и сразу применить обновление.
Ваш код обходит обычную структуру создания / обновления класса SQLiteOpenHelper, поэтому вам придется самостоятельно выполнять обновление. Вы можете просто удалить старый файл, переписав или введя команды SQL, если вам нужно сохранить данные.
Когда вам нужно перезаписать, вы должны перейти в меню Развертывание и убедиться, что опция Перезапись помечена как «Всегда», так как это значение по умолчанию. Плохо то, что по какой-то причине не работает должным образом

Итак, после установки приложения Android APK остается в папке / assets и (не скомпилированные исходные файлы, связанные с вашим проектом). Новый исполняемый файл (.so) будет извлечен из APK (Android Package - простой zip-файл), но / данные из вашего пакета не будут затронуты! Таким образом, вы должны сделать рутину, чтобы позаботиться об этом.
Я бы порекомендовал вам установить версию в вашей базе данных SQLite, выполнив команду pragma: PRAGMA user_version. По умолчанию возвращается 0 в качестве версии базы данных. Как только вы сделаете новое изменение в структуре, вызовите команду «PRAGMA user_version = #», пример: PRAGMA user_version = 3; это отметит базу данных.
Теперь вы можете сначала проверить версию пользовательской базы данных, если user_version совпадает с тем, что вы продолжаете, иначе код, приведенный ниже, сделает свое дело:
Код:
function DatabaseUpgraded(const ADatabaseFileName: String): Boolean;
var
Zip: TZipFile;
PackageName: JString;
begin
Result := False;
PackageName := SharedActivityContext.getPackageResourcePath;
if TFile.Exists(JStringToString(PackageName)) then
begin
TFile.Delete(TPath.GetHomePath + PathDelim + ADatabaseFileName);
Zip := TZipFile.Create;
Zip.Open(JStringToString(PackageName), TZipMode.zmRead);
Zip.Extract('assets/internal/' + ADatabaseFileName, TPath.GetDocumentsPath, False);
Zip.Close;
Zip.Free;
Result := True;
end;
end;
Включите модуль System.Zip и убедитесь, что ваша база данных ЗАКРЫТА, прежде чем вызывать подпрограмму. Вы можете расширить эту функцию, чтобы проверить прагму user_version и сразу применить обновление.