• 0
wamaco

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

Вопросы

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

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

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

 

Delphi Seattle 10

 

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


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

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

  • 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

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

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


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

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

Олег.

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


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

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

Олег.

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

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


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

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

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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


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

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