前回の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で新規プロジェクトを作成したら、
画面にTFDConnection・TFDTable(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の操作ロジックが含まれていません。
- 前回のINIファイル操作と異なり、
- 本記事のロジックはこの中から抜粋しています。
- エンバカデロ社が公開しているFireMonkeyのサンプルコード集。