Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Передача SQLite базы данных приложения на Delphi: синхронизация с сервером и работа с памятью

Delphi , Базы данных , SQL

Вопрос, с которым столкнулся разработчик, заключается в необходимости передачи SQLite базы данных от сервера к клиенту в приложении, созданном на Delphi. Основная проблема заключается в правильной передаче потока данных и последующем использовании базы данных на клиенте.

Шаг 1: Получение базы данных на сервере

Для начала рассмотрим код, который используется для получения базы данных на сервере:

procedure TfmxServer.actStreamTheDbExecute(Sender: TObject);
var
  ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;
  ms := dmplanner.GetDbAsStream; // Получение потока данных из DataModule
  ms.Position := 0;
  thrprofServer.SendStream(thrmanServer.RemoteProfiles.First,
    'Stream_TheDB', ms); // Отправка потока клиенту
end;

function TdmPlanner.GetDbAsStream: TMemoryStream;
var
  fs: TFilestream;
  ms: TMemoryStream;
begin
  fs := TFileStream.Create(consqlite.Params.Values['Database'], fmOpenRead);
  ms := TMemoryStream.Create;
  try
    ms.LoadFromStream(fs); // ms.size = 315392, размер файла также 315392 байта
    Result := ms;
    Result.Position := 0;
  finally
    FreeAndNil(fs);
    FreeAndNil(ms); // Убивает ли это Result?
  end;
end;

Шаг 2: Прием и запись базы данных на клиенте

На клиенте база данных принимается и записывается в файл следующим образом:

procedure TfrmMobile_Client_Main.DoStreamTheDb(const AResource: TRemoteResource);
var
  fs: TFilestream;
  ms: TMemoryStream;
begin
  fs := TFileStream.Create(dmplannerclient.consqlite.Params.Values['Database'],
    fmOpenReadWrite or fmCreate);
  try
    ms := TMemoryStream.Create;
    ms := TMemoryStream(AResource.Value.AsStream);
    ms.Position := 0; // ms.size = 315392, таким образом, мы получили весь файл.
    ms.SaveToStream(fs);
    dmPlannerClient.FillLbx(lbxRecipeNames);
    // Теперь заполняем ListBox, но при открытии запроса получаем ошибку
    // [FireDAC][Phys][SQLite] ERROR: unable to open database file.
  finally
    FreeAndNil(fs);
    FreeAndNil(ms);
  end;
end;

Шаг 3: Использование базы данных в памяти вместо файла на диске

Разработчик также интересуется возможностью использования базы данных в памяти, вместо хранения на диске. В комментариях упоминается использование TFDMemTable, который позволит создать статическую базу данных, доступную только для чтения.

Альтернативный ответ: Полная передача базы данных

Предложено простое решение для полной передачи базы данных, заключающееся в копировании файла базы данных на клиент. На сервере создается поток, который загружается из файла базы данных, и затем этот поток отправляется клиенту. На клиенте поток сохраняется в файл, после чего база данных открывается для использования.

procedure TApp1Form.SendDBAsStream;
var
  StreamToSend: TMemoryStream;
begin
  StreamToSend := TMemoryStream.Create;
  try
    StreamToSend.LoadFromFile('D:\Delphi\Code\Sqlite\DB1.Sqlite');
    StreamToSend.Position := 0;
    TetheringAppProfile1.Resources.FindByName('SqliteDB').Value := StreamToSend;
  finally
    // Не освобождаем StreamToSend?
  end;
end;

procedure TApp2Form.TetheringAppProfile1Resources0ResourceReceived(const Sender: TObject; const AResource: TRemoteResource);
var
  ReceivedStream: TStream;
  FileStream: TFileStream;
  FileName: string;
begin
  FileName := ExtractFilePath(Application.ExeName) + 'Temp.Sqlite';
  AResource.Value.AsStream.Position := 0;
  FileStream := TFileStream.Create(FileName, fmCreate);
  ReceivedStream := AResource.Value.AsStream;
  try
    ReceivedStream.Position := 0;
    FileStream.CopyFrom(ReceivedStream, ReceivedStream.Size);
  finally
    FileStream.Free;
  end;
  OpenTable;
end;

procedure TApp2Form.OpenTable;
begin
  if FDConnection1.Connected then
    FDConnection1.Connected := False;
  FDConnection1.Params.Clear;
  FDConnection1.Params.Add('Database=' + FileName);
  FDConnection1.DriverName := 'Sqlite';
  try
    FDConnection1.Connected := True;
    FDQuery1.Open('select * from mytable');
  except
    ShowMessage(Exception(ExceptObject).Message + ' ' + FileName);
  end;
end;

Заключение

Передача базы данных в приложении на Delphi может быть выполнена путем создания потока данных на сервере и его последующей передачи клиенту. Для работы с базой данных в памяти можно использовать TFDMemTable, а для полной передачи базы данных - скопировать файл базы данных на клиент. Важно правильно обрабатывать потоки данных и не забывать об их освобождении после использования.

Создано по материалам из источника по ссылке.

Вопрос связан с передачей SQLite базы данных от сервера к клиентскому приложению на Delphi, с последующей синхронизацией и возможностью использования базы данных в памяти.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: SQL ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-10 17:00:52/0.003587007522583/0