• 0
wamaco

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

Вопрос

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

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

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

 

Delphi Seattle 10

 

gelo1 понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

13 ответов на этот вопрос

  • 0

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

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

gelo1 понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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
gelo1, wamaco, ENRGY и 1 другому понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

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

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

Владимир и gelo1 понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
9 минут назад, dervish00 сказал:

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

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

dervish00 понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
3 часа назад, dervish00 сказал:

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

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

dervish00 понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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

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

Олег.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
1 минуту назад, gelo1 сказал:

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

Олег.

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

gelo1 понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Мне надо чтобы просто файл полностью заменился. С новыми данными.

С Уважением. Олег.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Ну тогда действуйте, как написано выше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу