Перейти к содержанию
Fire Monkey от А до Я
  • 0

Обновление файла БД без перезапуска приложения


#WAMACO

Вопрос

Подскажите как можно обновить целиком файл БД (SQLite) без закрытия приложения, например, по нажатию кнопки <Обновить БД>.

Интересуют особенности реализации для Android  и iOS.

Принимаются любые идеи, реализации и т.д.

 

Delphi Seattle 10

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Закрываешь все соединения (FDConnection.Close) и спокойно перезаписываешь файл базы данных.

Главное - это не деплоить файл базы данных в apk, а создавать его при первом открытии. иначе андроид не даст его удалить или перезаписать.

Ссылка на комментарий
  • 0

Под Android я делаю так. Вставляю изначально файл БД в Deploy.

Потом вызываю при необходимости процедуру

procedure TForm1.RefreshBD;
{ TODO -cKod : RefreshBD - обновление БД }
var
  PackageName: JString;
  zip: TZipFile;
begin
     // Отключаемся от базы
      FDConnection1.Connected := False;

      // Получаем имя apk файла
      PackageName := SharedActivityContext.getPackageResourcePath;

      if TFile.Exists(JStringToString(PackageName)) then
      begin
        // Удаляем старый файл базы
        TFile.Delete(TPath.GetHomePath + PathDelim + 'DBGK.db');

        // Извлекаем новый файл базы
        zip := TZipFile.Create;
        zip.Open(JStringToString(PackageName), TZipMode.zmRead);
        zip.Extract('assets/internal/DBGK.db', TPath.GetDocumentsPath, False);
        zip.Close;
        zip.free;
end;
  // Подключаемся к базе
  FDConnection1.Connected := True;
end;

 

Под iOS вставляю в ресурсы, потом вот так

 

procedure TForm1.RefreshBD;
{ TODO -cKod : RefreshBD - обновление БД }
begin
     // Отключаемся от базы
      FDConnection1.Connected := False;

  if FindResource(0, 'res_bd', PChar(RT_RCDATA)) <> 0 then
    rs_bd := TResourceStream.Create(0,'res_bd',PChar(RT_RCDATA));

  if TFile.Exists(TPath.GetHomePath+PathDelim+'Documents'+PathDelim +'dbgkios.db') then
    begin
      TFile.Delete(TPath.GetHomePath+PathDelim+'Documents'+PathDelim +'dbgkios.db');
      rs_bd.SaveToFile(TPath.GetHomePath+PathDelim+'Documents'+PathDelim +'dbgkios.db');
    end
  else
    begin
      rs_bd.SaveToFile(TPath.GetHomePath+PathDelim+'Documents'+PathDelim +'dbgkios.db');
    end;
  FDConnection1.Connected := True;
end;
Изменено пользователем masmat
Ссылка на комментарий
  • 0

Закрываешь все соединения (FDConnection.Close) и спокойно перезаписываешь файл базы данных.

Главное - это не деплоить файл базы данных в apk, а создавать его при первом открытии. иначе андроид не даст его удалить или перезаписать.

При указанном мной способе, файл перезаписывается на УРА 

Ссылка на комментарий
  • 0

Подниму темку. Все описанное выше хорошо для БД, в которые пользователь ничего не сохраняет, а как сделать то же (апгрейдить БД) в которую пользователь уже чего-то занес. Просится решение, что-то вроде выгрузки из текущей базы, например, в xml, удаление текущей, создание новой и загрузки в новую данных из xml. Отсюда вопрос: есть ли какие-либо готовые решения выгрузки SQLite БД в XML?

Ссылка на комментарий
  • 0
9 минут назад, dervish00 сказал:

Подниму темку. Все описанное выше хорошо для БД, в которые пользователь ничего не сохраняет, а как сделать то же (апгрейдить БД) в которую пользователь уже чего-то занес. Просится решение, что-то вроде выгрузки из текущей базы, например, в xml, удаление текущей, создание новой и загрузки в новую данных из xml. Отсюда вопрос: есть ли какие-либо готовые решения выгрузки SQLite БД в XML?

Вы как то странно, на мой взгляд ставите вопрос. Зачем тогда создавать новую, если уже есть старая? Так и делайте обновления старой))) update, alter и тд и тп.

Ссылка на комментарий
  • 0
3 часа назад, dervish00 сказал:

дааа, что-то я погорячился... все гораздо проще. но, вопрос в любом случае не снимается - SQLite -> XML, например для бакапа. правда, это другая тема...

Опять же, зачем xml!???? (Или я просто его ненавижу). Есть стандартные свойства для бекапа;)). Да хоть напямую в sql файл!

Ссылка на комментарий
  • 0

Здравствуйте MASMAT не знаю Вашего имени.

Ещё подскажите пожалуйста где в этом коде видно что из удалённого сервера скачивается файл базы?

// Извлекаем новый файл базы
        zip := TZipFile.Create;
        zip.Open(JStringToString(PackageName), TZipMode.zmRead);
        zip.Extract('assets/internal/DBGK.db', TPath.GetDocumentsPath, False);
        zip.Close;
        zip.free;

Олег.

Ссылка на комментарий
  • 0
3 минуты назад, gelo1 сказал:

Здравствуйте MASMAT не знаю Вашего имени.

Ещё подскажите пожалуйста где в этом коде видно что из удалённого сервера скачивается файл базы?


// Извлекаем новый файл базы
        zip := TZipFile.Create;
        zip.Open(JStringToString(PackageName), TZipMode.zmRead);
        zip.Extract('assets/internal/DBGK.db', TPath.GetDocumentsPath, False);
        zip.Close;
        zip.free;

Олег.

Я отвечу, нигде. Потому что речь идет об извлечении из архива zip

Ссылка на комментарий
  • 0
1 минуту назад, gelo1 сказал:

А как же сначала скачать на устройство а потом на устройстве обновить?

Олег.

Читайте мой ответ выше (по закачке). Если вы закачиваете файл БД, то он меняет ВСЮ базу! И то что было у клиента затирается! Если вы обновляете через insert update через файл sql - то ничего не затирается!

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...