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

Как использовать SQLite3 в Delphi и Pascal: простое руководство для начинающих.

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

 

SQLite3 - это легкая, но мощная встраиваемая база данных, которая идеально подходит для хранения данных в локальных приложениях. В этой статье мы рассмотрим, как использовать SQLite3 в средах Delphi и Free Pascal, включая хранение и извлечение изображений.

Варианты хранения изображений в приложении

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

  1. TImageList - подходит для небольших изображений (иконок)
  2. SQLite с BLOB полями - для хранения любых бинарных данных
  3. Собственный бинарный формат файла (как предложил paule32)
  4. Ресурсы приложения (как напомнил Thaddy)

Рассмотрим наиболее универсальный вариант - SQLite3.

Настройка SQLite3 в Delphi

Для работы с SQLite3 в Delphi вам понадобится компонент, например, TSQLite3Connection из FireDAC или сторонние библиотеки.

Пример подключения к базе данных:

uses
  FireDAC.Phys.SQLite, FireDAC.Comp.Client;

var
  Conn: TFDConnection;
begin
  Conn := TFDConnection.Create(nil);
  try
    Conn.DriverName := 'SQLite';
    Conn.Params.Database := 'C:\data\images.db';
    Conn.Connected := True;
    // Далее работа с базой данных
  finally
    Conn.Free;
  end;
end;

Создание таблицы для хранения изображений

procedure CreateImagesTable;
var
  Query: TFDQuery;
begin
  Query := TFDQuery.Create(nil);
  try
    Query.Connection := Conn;
    Query.SQL.Text := 'CREATE TABLE IF NOT EXISTS Images (' +
                      'ID INTEGER PRIMARY KEY AUTOINCREMENT, ' +
                      'Name TEXT, ' +
                      'Description TEXT, ' +
                      'ImageData BLOB, ' +
                      'Width INTEGER, ' +
                      'Height INTEGER)';
    Query.ExecSQL;
  finally
    Query.Free;
  end;
end;

Вставка изображения в базу данных

procedure InsertImage(const AName, ADescription: string; AImage: TImage);
var
  Query: TFDQuery;
  Stream: TMemoryStream;
begin
  Query := TFDQuery.Create(nil);
  Stream := TMemoryStream.Create;
  try
    Query.Connection := Conn;
    AImage.Picture.Graphic.SaveToStream(Stream);
    Stream.Position := 0;

    Query.SQL.Text := 'INSERT INTO Images (Name, Description, ImageData, Width, Height) ' +
                      'VALUES (:Name, :Desc, :Data, :Width, :Height)';
    Query.ParamByName('Name').AsString := AName;
    Query.ParamByName('Desc').AsString := ADescription;
    Query.ParamByName('Data').LoadFromStream(Stream, ftBlob);
    Query.ParamByName('Width').AsInteger := AImage.Picture.Width;
    Query.ParamByName('Height').AsInteger := AImage.Picture.Height;
    Query.ExecSQL;
  finally
    Query.Free;
    Stream.Free;
  end;
end;

Извлечение изображения из базы данных

procedure LoadImageFromDB(AImageID: Integer; AImage: TImage);
var
  Query: TFDQuery;
  Stream: TMemoryStream;
begin
  Query := TFDQuery.Create(nil);
  Stream := TMemoryStream.Create;
  try
    Query.Connection := Conn;
    Query.SQL.Text := 'SELECT ImageData FROM Images WHERE ID = :ID';
    Query.ParamByName('ID').AsInteger := AImageID;
    Query.Open;

    if not Query.IsEmpty then
    begin
      TBlobField(Query.FieldByName('ImageData')).SaveToStream(Stream);
      Stream.Position := 0;
      AImage.Picture.Graphic.LoadFromStream(Stream);
    end;
  finally
    Query.Free;
    Stream.Free;
  end;
end;

Альтернативные решения

1. Использование TImageList

Для небольших изображений действительно можно использовать TImageList:

var
  ImageList: TImageList;
  Image: TImage;
begin
  ImageList := TImageList.Create(nil);
  Image := TImage.Create(nil);
  try
    Image.Picture.LoadFromFile('image.png');
    ImageList.Add(Image.Picture.Bitmap, nil);
    // Далее можно использовать ImageList для отображения изображений
  finally
    Image.Free;
    ImageList.Free;
  end;
end;

2. Собственный бинарный формат файла

Как предложил paule32, можно создать собственный формат:

type
  TImageHeader = record
    Magic: Word;
    Count: Integer;
    Offsets: array of Integer;
  end;

  TImageData = record
    Size: Integer;
    Width: Integer;
    Height: Integer;
    Data: array of Byte;
  end;

procedure SaveImagesToCustomFile(const AFileName: string; AImages: array of TImage);
var
  Stream: TFileStream;
  Header: TImageHeader;
  Data: TImageData;
  I: Integer;
  MemStream: TMemoryStream;
begin
  Stream := TFileStream.Create(AFileName, fmCreate);
  try
    Header.Magic := $4D47; // 'GM' - наш магический номер
    Header.Count := Length(AImages);
    SetLength(Header.Offsets, Header.Count);

    // Записываем заголовок
    Stream.Write(Header, SizeOf(Header) - SizeOf(Header.Offsets));
    Stream.Write(Header.Offsets[0], Length(Header.Offsets) * SizeOf(Integer));

    // Записываем данные изображений
    for I := 0 to High(AImages) do
    begin
      Header.Offsets[I] := Stream.Position;

      MemStream := TMemoryStream.Create;
      try
        AImages[I].Picture.Graphic.SaveToStream(MemStream);
        Data.Size := MemStream.Size;
        Data.Width := AImages[I].Picture.Width;
        Data.Height := AImages[I].Picture.Height;
        SetLength(Data.Data, Data.Size);
        MemStream.Position := 0;
        MemStream.Read(Data.Data[0], Data.Size);

        Stream.Write(Data, SizeOf(Data) - SizeOf(Data.Data));
        Stream.Write(Data.Data[0], Data.Size);
      finally
        MemStream.Free;
      end;
    end;
  finally
    Stream.Free;
  end;
end;

Заключение

SQLite3 предоставляет отличный способ хранения изображений и других бинарных данных в вашем приложении. Это решение:

  1. Позволяет хранить все данные в одном файле
  2. Обеспечивает структурированное хранение с возможностью добавления метаданных
  3. Поддерживает эффективный поиск и извлечение данных
  4. Кросс-платформенное и легковесное

Для простых случаев можно использовать TImageList или собственный бинарный формат, но SQLite3 предлагает наиболее гибкое и масштабируемое решение.

Примеры кода в статье демонстрируют основные операции с SQLite3 в Delphi и Free Pascal. Вы можете адаптировать их под свои нужды и расширить функциональность по мере необходимости.

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

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


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-04 06:49:43/0.0058200359344482/0