• Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

Delphi Обновление баз данных SQLite с помощью Delphi

Lomanu4 Оффлайн

Lomanu4

Команда форума
Администратор
Регистрация
1 Мар 2015
Сообщения
1,481
Баллы
155
Этот пост будет посвящен проблеме, с которой вы можете столкнуться при разработке приложения для Android, но вам необходимо обновить базу данных. Кажется простым, но вы заметите, что вашему пользователю может потребоваться удалить предыдущее приложение, чтобы использовать новую базу данных, и это не хорошо!

Ваш код обходит обычную структуру создания / обновления класса SQLiteOpenHelper, поэтому вам придется самостоятельно выполнять обновление. Вы можете просто удалить старый файл, переписав или введя команды SQL, если вам нужно сохранить данные.

Когда вам нужно перезаписать, вы должны перейти в меню Развертывание и убедиться, что опция Перезапись помечена как «Всегда», так как это значение по умолчанию. Плохо то, что по какой-то причине не работает должным образом 1556613372465.png[если кто-то знает почему, дайте нам знать].

Итак, после установки приложения 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 и сразу применить обновление.
 
Вверх Снизу