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

Как вместе с программой установить файл базы данных?


tria

Вопрос

Перевожу проект с WinCE (Lazarus) под Андроид (Ембарк Делфи 10.4).

До этого под Андроид не писал.

В проекте используется файл базы данных. Его при установке ПО нужно сразу положить в доступном месте.

В БД будут писаться данные.

Как это сделать?

Я так понял, нужно указать файл БД в Deployment, но что нужно указывать в Remote path и что потом указать в FDConnection1.params.database?

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

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

  • 0

Если будете загружать файл в deployment тогда ваша база будет здесь 

Для remote path: assets\internal

TPath.Combine(TPath.GetDocumentsPath, 'filename')  { Internal }

Для remote path: assets

TPath.Combine(TPath.GetPublicPath, 'filename')  { External }

Есть же в конце то концов https://docwiki.embarcadero.com/RADStudio/Sydney/en/Creating_an_Android_App#Loading_and_Deploying_Files

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

Только возникли след. вопросы.

В каком модуле TPath? А то я пока обошелся GetHomePath.

И главное, в Deployment в колонке Overwrite стоит Always, а при отладке вижу, что база не перезаписана (я пробовал делать запись в БД и вижу, что при каждой отладке эта запись уже есть).

Ссылка на комментарий
  • 0
procedure TForm1.UpdateAsset(AssetName, FilePath: String);
var
  inputStream: JInputStream;
  FileOutputStream: JFileOutputStream;
  WData: TJavaArray<Byte>;
  LData: Integer;
begin

  try
  InputStream :=  TAndroidHelper.Context.getAssets.open(StringToJString(AssetName));
  except
    exit;
  end;

  try
  FileOutputStream := TJFileOutputStream.JavaClass.init(StringToJString(FilePath));
  except
    exit;
  end;

  WData := TJavaArray<Byte>.Create(4096);
  repeat
   try
       LData := InputStream.read(WData);
   except
       LData := -1;
   end;

  if LData <> -1 then
     begin
        FileOutputStream.write(WData, 0, LData);
     end;
  until (LData = -1) or (LData = 0);

  FileOutputStream.flush;
  FileOutputStream.close;
  inputStream.close;

end;

Обновление файла из assets в папку с программой

Пользоваться так проверяете при Form.Create что версия новая и вызываете UpdateAsset('internal/base.db', ApplicationPath + 'base.db');

 

 

Ссылка на комментарий
  • 0
29 минут назад, OnePeople сказал:
procedure TForm1.UpdateAsset(AssetName, FilePath: String);
var
  inputStream: JInputStream;
  FileOutputStream: JFileOutputStream;
  WData: TJavaArray<Byte>;
  LData: Integer;
begin

  try
  InputStream :=  TAndroidHelper.Context.getAssets.open(StringToJString(AssetName));
  except
    exit;
  end;

  try
  FileOutputStream := TJFileOutputStream.JavaClass.init(StringToJString(FilePath));
  except
    exit;
  end;

  WData := TJavaArray<Byte>.Create(4096);
  repeat
   try
       LData := InputStream.read(WData);
   except
       LData := -1;
   end;

  if LData <> -1 then
     begin
        FileOutputStream.write(WData, 0, LData);
     end;
  until (LData = -1) or (LData = 0);

  FileOutputStream.flush;
  FileOutputStream.close;
  inputStream.close;

end;

Обновление файла из assets в папку с программой

Пользоваться так проверяете при Form.Create что версия новая и вызываете UpdateAsset('internal/base.db', ApplicationPath + 'base.db');

 

 

а почему вообще возникает необходимость писать этот костыль?

почему Overwrite = Always в деплойменте не работает???

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

а почему вообще возникает необходимость писать этот костыль?

почему Overwrite = Always в деплойменте не работает???

Можно не писать в startupcopy.pas есть методы обновления ассетов. Самому лень писать))))

I feel that files that need to be deployed are files that should not and need not be changed by the application. They are resources like images. If an application changes a file, it does so with intent. The user via the developer wanted it that way. Changing it back through an update causes data loss. As a consequence all files that could be subject to change should not be deployed but generated when used.

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

Насколько помню по своей возне четырёхлетней давности с тогдашним Rad Studio. Проблема перезаписи БД из Deployment решалась постоянным увеличением версии программы, т.е. перед запуском на тест уcтройстве, надо заходить в настройки проекта и менять Version. Как сейчас обстоят дела - хз.

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

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

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

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

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

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

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

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

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

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

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