Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


【Delphi】FireMonkey FireDACでSQLite DBの読み書き

前回のINIファイル操作に続いて、今回はFireMonkeyのプラットフォームで、
FireDACでSQLite DBの読み取りや書き込みを行う方法を紹介します。
この手法を使えば、WindowsのみならずiOSやAndroidでもSQLiteが使用可能になります。

 


初期設定・ファイルの配置

アプリ内でDBのファイルを新規作成する場合は、プロジェクトで配置しておく必要はありません。

あらかじめ定義済みのデータファイル(.s3dbファイル等)を
アプリケーションと共に配置する場合は、以前のTipsに記載の手順で配置して下さい。
【Delphi】音声ファイルを再生する方法(#FireMonkey)

今回はOSをまたいでロジックを共通化するため、
各OSごとに異なるファイルの保管先フォルダを返す関数を作成します。
(※それぞれ、保管先の直下を想定しています)

{*******************************************************************************
  DBファイル保管パスの取得(関数名は任意、最後の「\」含む)
*******************************************************************************}
function WKFilePath: String;
begin
{$IF DEFINED(MSWINDOWS)} // Windowsの場合(今回はEXEと同階層)
  Result := ExtractFilePath(ParamStr(0));
{$ELSE}
{$IF (DEFINED(MACOS) AND NOT DEFINED(IOS))} // MacOSの場合
  Result := System.IOUtils.TPath.GetHomePath + System.SysUtils.PathDelim;
{$ELSE}                  // iOS・Androidの場合
  Result := System.IOUtils.TPath.GetDocumentsPath + System.SysUtils.PathDelim;
{$ENDIF}
{$ENDIF}
end;

 

初期設定として、FireMonkeyで新規プロジェクトを作成したら、
画面にTFDConnectionTFDTable(TFDQuery)TFDPhysSQLiteDriverLinkおよび
画面表示用のTMemo、入力用のTEdit、およびTButtonを配置します。

配置したTFDConnectionをダブルクリックして接続エディタを表示し、
ドライバIDに『SQLite』を指定しておきます。
またTFDTable(TFDQuery)のConnectionプロパティには、
今一緒に配置したTFDConnectionを指定しておきます。

TFDConnectionの「BeforeConnect」「AfterConnect」イベントを定義し、
接続時の処理を以下のように記述します。
(TFDPhysSQLiteDriverLinkは配置しておくだけで、他の設定等は不要)

{*******************************************************************************
  TFDConnection 接続前処理
*******************************************************************************}
procedure TForm1.connSQLiteBeforeConnect(Sender: TObject);
begin
  // 接続先のDBファイルを定義する
  connSQLite.Params.Values['Database'] := WKFilePath + 'WKTR17.s3db';
end;

{*******************************************************************************
  TFDConnection 接続後処理
*******************************************************************************}
procedure TForm1.connSQLiteAfterConnect(Sender: TObject);
const
  // ファイル作成用SQL
  cSQL_Create = ' CREATE TABLE IF NOT EXISTS WKTR17 (' +
                ' WKHANO TEXT(8),  WKHADT INTEGER,  WKSICD TEXT(4),  ' +
                ' WKSINM TEXT,     WKTNNM TEXT,     WKTEL  TEXT(15), ' +
                ' WKFAX  TEXT(15), WKHICD TEXT(5),  WKHINM TEXT,     ' +
                ' WKNOKI INTEGER,  WKSURY INTEGER,  WKTANI TEXT(10), ' +
                ' WKNOCD TEXT(8),  WKNONM TEXT,     WKBIK1 TEXT,     ' +
                ' WKBIK2 TEXT,     UNIQUE(WKHANO, WKHADT) ) ';
begin
  // 接続時にテーブルが無ければCREATE TABLEで作成する
  connSQLite.ExecSQL(cSQL_Create);
end;

 


SQLite DBの読み取り方法

ここからはSQLiteのDBを参照する手順を紹介します。

手順としてはDelphi/400など他のデータベースと同様に、
TFDTableでTableNameを指定してオープンするか、
TFDQueryでSELECTのSQLを実行します。

以下はTFDTableで指定のファイルをオープンし、
結果のフィールド値をMemoに順次セットしていくサンプルです。
(今回TFDTable名は「tblWKTR17」、DB名は「WKTR17.s3db」としています。)

{*******************************************************************************
  SQLite読込処理
*******************************************************************************}
procedure TForm1.Button1Click(Sender: TObject);
var
  sROW: String;
begin
  // FireDAC未接続の場合は接続
  //(ファイルが無い場合はエラーを防ぐため、先述の処理でCREATE TABLEする)
  if (not connSQLite.Connected) then
  begin
    connSQLite.Connected := True;
  end;

  // TFDTableを開いて内容をMemoに表示
  tblWKTR17.Close;
  tblWKTR17.TableName := 'WKTR17';
  tblWKTR17.Open;
  Memo1.Lines.Clear;
  while not(tblWKTR17.Eof) do
  begin
    // 4つのフィールドの値をカンマ区切りでMemoに表示させる
    sROW := tblWKTR17.FieldByName('WKHANO').AsString + ',' +  // 発注№
            tblWKTR17.FieldByName('WKHINM').AsString + ',' +  // 品名
            tblWKTR17.FieldByName('WKSURY').AsString + ',' +  // 数量
            tblWKTR17.FieldByName('WKNONM').AsString;         // 納品先名
    Memo1.Lines.Add(sROW);

    tblWKTR17.Next; // 次の行へ
  end;
end;

 


SQLite DBの書き込み方法

書き込みでもDelphi/400と同じようにSQLで更新できます。
(TFDTableの場合、Post時に内部的に更新SQLが発行されます)

以下はフィールド値を入力するためのTEditを使用して
TFDQuery(qryINSERT)でレコードをINSERTするサンプルです。

{*******************************************************************************
  SQLite書き込み処理
*******************************************************************************}
procedure TForm1.Button2Click(Sender: TObject);
const
  // レコード追加用SQL
  cSQL_Insert = ' INSERT INTO WKTR17 ' +
                ' (WKHANO, WKHINM, WKSURY, WKNONM)   ' +
                ' VALUES ' +
                ' (:WKHANO, :WKHINM, :WKSURY, :WKNONM) ';
begin
  // FireDAC未接続の場合は接続
  if (not connSQLite.Connected) then
  begin
    connSQLite.Connected := True;
  end;

  // FireDACでDBファイルにレコードを追加
  qryINSERT.SQL.Text := cSQL_Insert;
  qryINSERT.ParamByName('WKHANO').AsString  := Edit1.Text;
  qryINSERT.ParamByName('WKHINM').AsString  := Edit2.Text;
  qryINSERT.ParamByName('WKSURY').AsInteger := StrToIntDef(Edit3.Text, 0);
  qryINSERT.ParamByName('WKNONM').AsString  := Edit4.Text;

  // SQL実行
  qryINSERT.ExecSQL;
end;

 


VCLでSQLiteを活用するには

今回のロジックは、VCLの開発環境でも同様に使用可能です。
(FireDACの各コンポーネントも移植可能です)

 


<参考リンク>

  • GitHub – Embarcadero/DelphiArcadeGames
    • エンバカデロ社が公開しているFireMonkeyのサンプルコード集。
      エンバカデロ社の紹介ブログ記事
    • 上記のリンクからソースを取得して「Full」フォルダ内の各ソースを参照。
      • 前回のINIファイル操作と異なり、
        GetItから取得するバージョンにはSQLiteの操作ロジックが含まれていません。
    • 本記事のロジックはこの中から抜粋しています。