Sign in Join
Wiki copytemporary

SQLite/ja: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## SQLite と FPC/Lazarus によるサポートについて
22
33SQLiteは、FPCとLazarusアプリケーションで使用できる組み込み(非サーバー)の単一ユーザーデータベースである。さまざまなドライバーを使用して、FPC/LazarusプログラムからSQLiteにアクセスできる。すべてのドライバーは、動作するために実行可能ディレクトリ(プロジェクトディレクトリまたはLazarusプロジェクト設定に依存する)にSQLiteライブラリ/dllが必要である(および実行可能ファイルと一緒に配布される)。
44
55Win64: FPC/Lazarus Win64に関しては、特定のFPC/Lazarus Win64バージョンを使用しないようにすることに関する[[Windows Programming Tips|警告がある]]。
66
77### SQLite への直接アクセス
88
99LiteDAC(SQLite Data Access Components)は、Lazarus(およびFree Pascal)からWindows、Mac OS X、iOS、Android、Linux、FreeBSDの32ビットおよび64ビットプラットフォームに対して、SQLiteへのネイティブ接続を提供するコンポーネントのライブラリである。LiteDACは、プログラマーが追加のライブラリをデプロイすることなく、真にクロスプラットフォームなデスクトップおよびモバイルSQLiteデータベースアプリケーションを開発できるように設計されている。
1010
1111商業的な製品のトライアルバージョンを以下でダウンロードできる: [Lazarus components](https://www.devart.com/litedac/download.html)
1212
1313### ビルトインの SQLDB
1414
1515FPC/Lazarusには、組み込みのSQLDBコンポーネントが含まれており、これにはSQLiteデータベースへのサポート([[TSQLite3Connection/ja]])が含まれている。これは[[Component Palette/ja|Component Palette/jaの]][[SQLdb tab/ja|SQLdb tab/jaからアクセスでき]]、例えば[[TDBGrid/ja|TDBGrid/jaなどのデータベースコンポーネントを]]使用したGUIを作成することができる。SQLDBを使用する利点は、プログラムをあまり変更することなく、FirebirdやPostgreSQLなどの異なるデータベースに簡単に変更できる。
1616
1717詳細は以下を参照のこと
1818
1919#### Spatialiteサポート
2020
2121Spatialiteは、SQLiteにGIS(地理情報システム)機能を追加したもので、SQLDB内から使用することができる。詳細については、[[Spatialite|Spatialiteを]]参照のこと。
2222
2323#### SQLiteの暗号化のサポート
2424
2525最近のFree Pascal Compiler(FPC)のバージョンでは(2012年3月に実装された)、SQLDBはSQLite3の拡張バージョンのいくつかをサポートしており、これによりSQLiteデータベースファイルをAESアルゴリズムを使用して暗号化することができる。暗号化キーを設定するには、パスワードプロパティを使用する。
2626
2727Examples:
2828
2929- [SQLCipher](http://sqlcipher.net/): オープンソース、例えば、Windows用バイナリは無料ではない(自身でコンパイルする必要がある)
3030- [System.Data.SQLite](http://system.data.sqlite.org/): オープンソース、Windows (32, 64, CE) バイナリが利用できる。コンパイルされたバイナリの1つをダウンロードし、SQLite.Interop.dllをsqlite3.dllにリネームする(もし静的にリンクしているのであれば、System.Data.SQLite.DLLをsqlite3.dllにリネームする必要がある)
3131- [wxSQLite3](http://wxcode.sourceforge.net/docs/wxsqlite3/): オープンソース、Linuxに対するいくつかのバイナリが利用できる(例えば: <https://launchpad.net/ubuntu/oneiric/+package/libwxsqlite3-2.8-0>)
3232
3333#### sqlite3backup
3434
3535sqlite3backupは、FPCに提供されているユニットであり、Lazarusには含まれていないが、プログラムで使用することができる。これは、SQLite3のバックアップ/リストア機能を提供する。sqlite3backupは、SQLDBのsqlite3connを使用する。
3636
3737### Zeos
3838
3939[Zeos](https://sourceforge.net/projects/zeoslib/)
4040
4141### SQLitePass
4242
4343[SqlitePass](http://source.online.free.fr/) components. Status: unknown.
4444
4545### TSQLite3Dataset と TSQLiteDataset
4646
4747TSQLiteDataset(sqlitedsユニット)およびTSQLite3Dataset(sqlite3dsユニット)パッケージも提供されてる。APIリファレンス、チュートリアルに関しては使用法は以下を参照のこと [sqlite4fpc homepage](http://sqlite4fpc.yolasite.com/)
4848
4949TSQLiteDatasetとTSQLite3Datasetは、それぞれ2.8.xおよび3.x.xのSQLiteデータベースにアクセスする、[[TDataSet|TDataSetの]]派生クラスである。新しいプロジェクトでは、SQLite 3.xが現在のバージョンであるため、TSQLite3Datasetを使用することが一般的である。
5050
5151他のFPC/LazarusのSQLiteドライバやアクセス方法と比較した場合の主な利点と欠点は次のとおりである:
5252
5353利点:
5454
5555- 柔軟性: プログラマーはSQL言語を使用するかどうかを選択できる。これにより、シンプルなテーブルレイアウトやSQL/sqliteで許可されている任意の複雑なレイアウトで作業できる。
5656
5757欠点:
5858
5959- 他のデータベースに変更する際、SQLDBやZeosコンポーネントを使用する場合よりも、変更がより困難になる。
6060
6161> **Note:** 上記の情報から、多くのユーザーはSQLDBやZeosを利用することが一般的である。これらのツールを利用することで、SQLiteデータベースへの簡単な接続や操作が可能になる。
6262
6363## SQLiteでSQLdbコンポーネントを使用する
6464
6565これらの手順は、特にSQLiteデータベースのSQLDBコンポーネント、特にTSQLite3Connectionの利用に焦点を当てている。SQLDBコンポーネントやそれらの使用方法についてより包括的に理解するには、[[SqlDBHowto|SqlDBHowto/jaを]]参照のこと。これには、LazarusのSQLDBコンポーネントに関する一般的な概要や有用な情報が含まれている。
6666
6767[[SQLdb Tutorial1/ja|SQLdb_Tutorial1/jaでは]]、SQLite/SQLDB(およびFirebird/SQLDB、PostgreSQL/SQLDBなど、SQLDBがサポートするほとんどのRDBMS)向けに書かれたGUIデータベース対応プログラムのチュートリアルを見ることができる。
6868
6969LazarusのSQLdbタブから3つのコンポーネントの組み合わせを使用する: TSQLite3Connection、TSQLTransaction、TSQLQueryである。TSQLQueryはTDatasetとして機能し、最も単純な場合にはテーブルの1つを表します。単純化のために、既存のSQLiteデータベースファイルがすでに存在しており、新しいものを作成する必要がないことを確認してください。 TSQLite3Connectionは、自分で宣言したい場合やFreePascalで作業している場合は、*sqlite3conn*ユニットで見つけることができる。
7070
7171通常通り、これらの3つのコンポーネントは互いに接続される。TSQLQueryでは、DatabaseとTransactionのプロパティを設定する。TSQLTransactionでは、Databaseのプロパティを設定する。TransactionとConnectionのコンポーネントではあまりすることはない。興味深いことのほとんどは、TSQLQueryで行われます。以下のようにコンポーネントを設定する:
7272
7373TSQLite3Connection:
7474
7575- DatabaseName: このプロパティをSQLiteファイルのファイル名(絶対パス!)に設定します。残念ながら、単純に相対パスを使用してデザイン時とランタイム時で変更せずに動作する方法はない。***これはまだ真実か?ポストビルドのシェルスクリプトでdbファイルを単にコピーするか、シンボリックリンクを作成できない?***。デザイン時に含まれている内容に関係なく、常に正しいファイルへのパスがアプリケーション起動時にプログラムによって設定されていることを確認する必要がある。
7676
7777注意: フルライブラリパスを設定するには(Linux/OSXのアプリケーションディレクトリなど、OSがそれを見つけられない場所にsqliteのdll/so/dylibを配置した場合)、*SQLiteLibraryName*プロパティを設定できます(任意の接続が確立される前に、たとえばメインフォームのOnCreateイベント内で)以下のように:
7878
7979``` pascal
8080SQLiteLibraryName:='./sqlite3.so';
8181```
8282
8383TSQLQuery:
8484
8585- SQL: これをテーブルのいずれかに対するシンプルなselectクエリに設定する。例えば、テーブル 'foo' があり、このデータセットがこのテーブルを表すようにしたい場合は、以下を使用する:
8686
8787``` SQL
8888SELECT * FROM foo
8989```
9090
9191- Active: IDE内でこれをTrueに設定して、すべてが正しく設定されているかどうかをテストする。これにより、トランザクションと接続オブジェクトも自動的にアクティブになる。エラーが発生した場合は、接続のDatabaseNameが正しくないか、SQLクエリが間違っている可能性がある。後で、フィールドを追加し終えた後(以下を参照)、すべてを再び非アクティブに設定してください。IDEがアプリケーションのテスト中にSQLiteデータベースをロックしないようにします(シングルユーザーで!)。
9292
9393- *おそらく正常な動作には必要ないかもしれない - 確認する必要がある(2012年6月)*。これで、TSQLQueryにフィールドを追加できるようになった。コンポーネントがまだアクティブに設定されている間に、右クリックして「edit fields...」をクリックする。"+"ボタンをクリックしてフィールドを追加する。これにより、SQLクエリが返したすべてのフィールドが一覧表示される。必要なすべてのフィールドを追加し、ルックアップフィールドもここで追加できる。この場合、他のデータセットで必要なフィールドをすでに定義していることを確認した後、参照フィールドを追加することを開始すること。テーブルに多くの列がある場合で、すべてを必要としない場合は、それらは省略できる。SQLを少し具体的にすることもできる。
9494- コード内でSQLQuery.ApplyUpdatesおよびSQLTransaction.Commitを呼び出す必要がある。データ連動コントロールと一緒に使用する場合は、TSQLQuery.AfterPostおよびAfterInsertイベントが良い場所だが、もちろん、これらの呼び出しを後で行うこともできる。これらの呼び出しを行わない場合、データベースは更新されない。
9595- "Database is locked": IDEがまだデータベースをロックしているかもしれない(SQLiteはシングルユーザーデータベースである)。TSQLQueryオブジェクトのすべてのフィールドを定義した後に、コンポーネントを非アクティブにしてから切断するのを忘れた可能性がある。実行時にパスを設定し、オブジェクトをアクティブにするには、フォームのOnCreateイベントを使用する。IDE内でTSQLQueryに設定するほとんどの設定は、デザイン時にアクティブである必要はなく(一部はデザイン時にアクティブであってはいけない場合もある)、唯一の例外はフィールドの定義です。デザイン時に非アクティブであることが通常の状態であるべきである。
9696- テーブルはすべて主キーを持っている必要があり、対応するフィールドがpfInKeyのみであり、他のフラグがないようにする(これらのフラグは、自動的に更新クエリと削除クエリを構築する際にフィールドがどのように使用されるか、およびどこで使用されるかを制御する)。
9797- ルックアップフィールドを用いている場合
9898 - ルックアップフィールドのProviderFlagsが完全に空であることを確認すること。これにより、更新クエリでその名前が使用されることはない。ルックアップフィールド自体はデータフィールドではなく、他のフィールド、つまり対応するキーフィールドの値にのみ作用し、後で更新クエリで使用されるのはこのキーフィールドのみである。通常、DBGridに表示したくないキーフィールドを非表示にすることができるが、定義する必要がある。
9999 - LookupCacheをTrueに設定する必要がある。現時点では、なぜかルックアップフィールドはそれ以外の場合(しかし動作はする)に何も表示されないため、これを設定する必要がある。そして、奇妙なことに、TSQLite3Datasetや他のTXXXDatasetコンポーネントを使用する場合は正反対の設定にする必要がある。こちらではFalseに設定する必要がある。これが意図された動作なのか、それともバグなのかはまだ確信が持てない。
100100- 通常、シンプルなテーブルでは、InsertSQL、UpdateSQL、DeleteSQLのいずれのプロパティも設定する必要はない。これらを空のままにしておいてよい。すべてのフィールドのProviderFlagsが正しく設定されていれば、必要なSQLを動的に作成できるはずである。InsertSQL、UpdateSQL、DeleteSQLの詳細については、[[Working With TSQLQuery|Working_With_TSQLQuery#TSQLQuery.InsertSQL.2C_TSQLQuery.UpdateSQL_and_TSQLQuery.DeleteSQL:_Basic_Use_of_Parametersを]]参照のこと。
101101
102102上記の設定がすべて正しく行われている場合、TSQLQueryを他の任意のTDatasetと同様に使用できるはずである。プログラムでデータを操作するか、フォームにTDatasouceを配置し、それをTSQLQueryに接続してから、TDBGridなどのデータコントロールを使用することができる。
103103
104104### データベースを作る
105105
106106[TSQLite3Connection.CreateDB](http://www.freepascal.org/docs-html/fcl/sqldb/tsqlconnection.createdb.html)メソッドは親クラスから継承されたもので実際には何も行わない。まだファイルが存在しない場合にデータベースを作成するには、次の例のようにテーブルデータを書き込む必要がある。 (Lazarus 1.3以降で提供されているsqlite_encryption_pragmaの例から抜粋されたコード)
107107
108108``` pascal
109109var
110110 newFile : Boolean;
111111begin
112112
113113 SQLite3Connection1.Close; // 開始時はコネクションが閉じていることを保証する
114114
115115 try
116116 // このデータベースは初めて作られているので
117117 // ファイルが既にあるかどうか確かめる
118118 newFile := not FileExists(SQLite3Connection1.DatabaseName);
119119
120120 if newFile then
121121 begin
122122 // データベースとテーブルを作る
123123 try
124124 SQLite3Connection1.Open;
125125 SQLTransaction1.Active := true;
126126
127127 // 「DATA」という名前の新しいデータベースを設定する
128128 SQLite3Connection1.ExecuteDirect('CREATE TABLE "DATA"('+
129129 ' "id" Integer NOT NULL PRIMARY KEY AUTOINCREMENT,'+
130130 ' "Current_Time" DateTime NOT NULL,'+
131131 ' "User_Name" Char(128) NOT NULL,'+
132132 ' "Info" Char(128) NOT NULL);');
133133
134134 // DATAテーブルのidに基づいてインデクスを作る
135135 SQLite3Connection1.ExecuteDirect('CREATE UNIQUE INDEX "Data_id_idx" ON "DATA"( "id" );');
136136
137137 SQLTransaction1.Commit;
138138
139139 ShowMessage('Succesfully created database.');
140140 except
141141 ShowMessage('Unable to Create new Database');
142142 end;
143143 end;
144144 except
145145 ShowMessage('Unable to check if database file exists');
146146 end;
147147 end;
148148```
149149
150150### ユーザー定義の照合順序を作成する
151151
152152``` pascal
153153// utf8 の大文字小文字を比較するコールバック関数
154154function UTF8xCompare(user: pointer; len1: longint; data1: pointer; len2: longint; data2: pointer): longint; cdecl;
155155var S1, S2: AnsiString;
156156begin
157157 SetString(S1, data1, len1);
158158 SetString(S2, data2, len2);
159159 Result := UnicodeCompareStr(UTF8Decode(S1), UTF8Decode(S2));
160160end;
161161
162162// utf8 の大文字小文字を比較するコールバック関数
163163function UTF8xCompare_CI(user: pointer; len1: longint; data1: pointer; len2: longint; data2: pointer): longint; cdecl;
164164var S1, S2: AnsiString;
165165begin
166166 SetString(S1, data1, len1);
167167 SetString(S2, data2, len2);
168168 Result := UnicodeCompareText(UTF8Decode(S1), UTF8Decode(S2));
169169end;
170170
171171// SQLite3 APIを使用して照合順序を登録する(sqlite3dynユニットが必要):
172172sqlite3_create_collation(SQLite3.Handle, 'UTF8_CI', SQLITE_UTF8, nil, @UTF8xCompare_CI);
173173// もしくはTSQLite3Connectionのメソッドを使用:
174174CreateCollation('UTF8_CI',1,nil,@UTF8xCompare_CI);
175175
176176// ここでSQL様に大文字小文字を区別しない比較を用いることができる:
177177// SELECT * FORM table1 WHERE column1 COLLATE UTF8_CI = 'á'
178178
179179// これはLIKE演算子では機能しない
180180// また、LIKE演算子をサポートするためには、sqlite3_create_function()を用いてデフォルトのLIKEをオーバーロードしなければならない
181181// http://www.sqlite.org/lang_corefunc.html#like
182182```
183183
184184### ユーザー定義関数を作る
185185
186186``` pascal
187187// デフォルトの提供されたLOWER()関数をユーザーにオーバーロードする例
188188// このデモを実行するにはuses節に 'sqlite3dyn' と 'ctypes'を記述する必要がある
189189// そして、定数'SQLITE_DETERMINISTIC'の値を$800とする
190190
191191procedure UTF8xLower(ctx: psqlite3_context; N: cint; V: ppsqlite3_value); cdecl;
192192var S: AnsiString;
193193begin
194194 SetString(S, sqlite3_value_text(V[0]), sqlite3_value_bytes(V[0]));
195195 S := UTF8Encode(AnsiLowerCase(UTF8Decode(S)));
196196 sqlite3_result_text(ctx, PAnsiChar(S), Length(S), sqlite3_destructor_type(SQLITE_TRANSIENT));
197197end;
198198
199199// SQLite3 APIを用いてLOWER()関数を登録する(sqlite3dynユニットが必要である):
200200sqlite3_create_function(SQLite3.Handle, 'lower', 1, SQLITE_UTF8 or SQLITE_DETERMINISTIC, nil, @UTF8xLower, nil, nil);
201201```
202202
203203### SQLite3 と 日付
204204
205205- SQLite 3では、日付を特別なDateTime値として保存しない。代わりに、それらを文字列、倍精度浮動小数点数、または整数として保存できる。詳細については <http://www.sqlite.org/datatype3.html#datetimeを参照のこと>
206206- 文字列では、日付の区切り記号はSQL標準/ISO 8601に従って '-' である。したがって、組み込みのDATE関数を使用してINSERTを行うと、'YYYY-MM-DD'のような形式で保存される。
207207- DateTime値を文字列として保存すると、DataSetsで問題が発生する可能性がある。.AsDateTime修飾子はSQLiteの「文字列日付」でスタックする可能性があるが、SQL SELECTステートメントで`strftime(`*`%d/%m/%Y`*`,recdate) AS sqlite3recdate`のようなものを使用することで、SQLite3に指定された形式で日付レコードを返すように指示できる(フォーマット文字列%d /%m /%dは、.AsDateTimeが理解するロケール日付形式に対応しています)。**==\> このような場合は、問題を示す例のアプリケーションを使用してバグレポートを作成してほしい**
208208
209209日付を文字列として保存している場合(たとえばBETWEEN関数を使用して)、比較は常に**文字列**の比較になることを覚えておくこと。したがって、比較結果は日付値の保存方法に依存する。
210210
211211#### UTCの代わりにローカルタイムをデフォルトに用いる
212212
213213CURRENT_TIME, CURRENT_DATE and CURRENT_TIMESTAMP は現在のUTC日付および、もしくは時刻を返す。ローカルの日付、および、または時刻を用いるために以下のようにする:
214214
215-` DEFAULT (datetime('now','localtime')) for datetime values formated YYYY-MM-DD HH:MM:SS`\
216-` DEFAULT (date('now','localtime')) for date value formated YYYY-MM-DD`\
217-` DEFAULT (time('now','localtime')) for time value formated HH:MM:SS`
215+```text
216+ DEFAULT (datetime('now','localtime')) for datetime values formated YYYY-MM-DD HH:MM:SS
217+ DEFAULT (date('now','localtime')) for date value formated YYYY-MM-DD
218+ DEFAULT (time('now','localtime')) for time value formated HH:MM:SS
219+```
218220
219221### SQLDB と SQLite のトラブルシューティング
220222
221223- デザイン時のサポート(フィールドなど)が機能するには、Lazarusがsqlite3.dllも見つける必要があることに注意すること。
222224- 同じことがデータベースのファイル名にも適用される。デザイン時にフィールド名などを抽出する場合は常に絶対パスを使用すること。そうしないと、IDEがそのディレクトリに空のファイルを作成する。問題が発生した場合は、lazarus/ディレクトリにデータベースファイルのゼロバイトコピーがないか確認すること。
223225- マスター/ディテール関係がある場合、スレーブデータセットの外部キーの値を取得するために、各挿入後にマスターデータセットを更新する必要がある。これは、マスターデータセットのAfterPostイベントで、次のオーバーロードされた手順のいずれかを呼び出すことで行うことができる:
224226
225227``` pascal
226228interface
227229 procedure RefreshADatasetAfterInsert(pDataSet: TSQLQuery);overload;
228230 procedure RefreshADatasetAfterInsert(pDataSet: TSQLQuery; pKeyField: string);overload;
229231
230232implementation
231233
232234procedure RefreshADatasetAfterInsert(pDataSet: TSQLQuery; pKeyField: string);
233235
234236//このプロシージャはデータセットをリフレッシュし、カーソルを最後のレコードに配置する
235237//データセットが自動インクリメントの主キーでソートされていることが保証されていない場合に使用する必要がある
236238var
237239 vLastID: Integer;
238240 vUpdateStatus : TUpdateStatus;
239241begin
240242 vUpdateStatus := pDataset.UpdateStatus;
241243 //データベースに最後に挿入されたIDを取得
242244 pDataset.ApplyUpdates;
243245 vLastID:=(pDataSet.DataBase as TSQLite3Connection).GetInsertID;
244246 //ここで、それぞれの行に戻る
245247 if vUpdateStatus = usInserted then begin
246248 pDataset.Refresh;
247249 //それぞれの行に戻り、リフレッシュする
248250 pDataset.Locate(pKeyField,vLastID,[]);
249251 end;
250252end;
251253
252254procedure RefreshADatasetAfterInsert(pDataSet: TSQLQuery);
253255//このプロシージャはデータセットをリフレッシュし、カーソルを最後のレコードに配置する
254256//データセットが自動インクリメントの主キーでソートされていることが保証されていない場合に使用する必要がある
255257var
256258 vLastID: Integer;
257259 vUpdateStatus : TUpdateStatus;
258260begin
259261 vUpdateStatus := pDataset.UpdateStatus;
260262 pDataset.ApplyUpdates;
261263 vLastID:=(pDataSet.DataBase as TSQLite3Connection).GetInsertID;
262264 if vUpdateStatus = usInserted then begin
263265 pDataset.Refresh;
264266 //危険!
265267 pDataSet.Last;
266268 end;
267269end;
268270
269271procedure TDataModule1.SQLQuery1AfterPost(DataSet: TDataSet);
270272begin
271273 RefreshADatasetAfterInsert(Dataset as TSQLQuery); //もしデータセットがプライマリキーでソートされているなら
272274end;
273275
274276procedure TDataModule1.SQLQuery2AfterPost(DataSet: TDataSet);
275277begin
276278 RefreshADatasetAfterInsert(Dataset as TSQLQuery, 'ID'); //もしデータセットがプライマリキーでソートされていることが不確かなら
277279end;
278280```
279281
280282### トランザクションとは別に行われるべきVacuum と 他のオペレーション
281283
282284SQLDBは常に接続を必要とするようだが、PragmaやVacuumなどの一部の操作はトランザクションの外で行う必要がある。トランザクションを終了し、必要な操作を実行し、再びトランザクションを開始するトリックを使用する(これにより、SQLDBが混乱しないようする)。
283285
284286``` pascal
285287 // ペンディング中のすべてのオペレーションをコミットするか、"fresh" sqlconnectionをもちいる
286288 Conn.ExecuteDirect('End Transaction'); // SQLdbによって開始されたトランザクションを終える
287289 Conn.ExecuteDirect('Vacuum');
288290 Conn.ExecuteDirect('Begin Transaction'); //SQLdbが用いるためトランザクションを開始
289291```
290292
291293## TSQLite3Dataset を使う
292294
293295この節では、SQLite データベースへアクセスするために、どのように TSQLite2Dataset または TSQLite3Dataset コンポーネント を用いるかを詳しく説明しています。 Luiz Américo による luizmed(at)oi(dot)com(dot)br
294296
295297#### 要求事項
296298
297299- sqlite2 データベースのためには(レガシー):
298300 - FPC 2.0.0 以上
299301 - Lazarus 0.9.10 以上
300302 - SQLite runtime library 2.8.15 以上*
301303
302304- Sqlite2 はもはやメインテナンスされておらず、sqlite のサイトでバイナリファイルを見つけることはできません。
303305
304306- sqlite3 データベースのためには:
305307 - FPC 2.0.2 以上
306308 - Lazarus 0.9.11 (svn revision 8443) 以上
307309 - SQLite runtime library 3.2.1 以上 ([www.sqlite.org](http://www.sqlite.org) から入手してください。)
308310
309311**Lazarus のプロジェクトを作る前に、次の事を確認してください。:**
310312
311313- SQLite ライブラリが
312314 - システム PATH にある
313315 - 実行ファイルの出力されるディレクトリと Lazarus(または現在のプロジェクトの)ディレクトリにある - このオプションは Windows のみです。
314316- Linuxでは、cmemを メインプログラムの uses の最初のユニットにしているかどうか
315317 - Debian や Ubuntu またその他の Debian-like ディストロにおいては、Lazarus IDE に libsqlite-dev/libsqlite3-dev, not only sqlite/sqlite3 パッケージをインストールする必要があります。(OpenSuSe にも適用してください。)
316318
317319### 使い方 (基本)
318320
319321/components/sqlite にあるパッケージをインストールしてください。([[Install Packages/ja|ここにその]]方法があります。)
320322
321323設計時に下記のプロパティをセットして下さい。
322324
323325- FileName: sqliteファイルへのパス\[必須\]
324326- TableName: sql文で使うテーブル名\[必須\]
325327- SQL: SQLのSELECT文 \[必要に応じて\]
326328- SaveOnClose: デフォルト値はfalse。つまり変更は保存されない。trueに変更可能。 \[必要に応じて\]
327329- Active: 設計時またはプログラムのスタート時に設定\[必須\]
328330
329331**テーブルを作成する(Dataset)**
330332
331333コンポーネントアイコンをダブルクックするか、右マウスボタンのクリックで現れるポップアップメニューより、'Create Table' を選択します。 簡単な説明のあるテーブルエディタが表示されます。
332334
333335下記は TSqliteDataset と TSqlite3Dataset でサポートされているすべてのフィールドの型です。
334336
335337- Integer
336338- AutoInc
337339- String
338340- Memo
339341- Bool
340342- Float
341343- Word
342344- DateTime
343345- Date
344346- Time
345347- LargeInt
346348- Currency
347349
348350**データを取得する**
349351
350352テーブルを生成した後か、以前作ったテーブルで作業する場合、Open 手続きでデータセットを開いて下さい。 SQL プロパティがセットされていない場合、すべてのフィールドのすべてのレコードを取得するためには、次のような1文をSQLにセットします。:
351353
352354``` pascal
353355SQL := 'Select * from TABLENAME';
354356```
355357
356358**データファイル上に変更を適用する**
357359
358360ApplyUpdates 関数を使うために, データセットは、主キーの条件を満たす少なくとも1つのフィールドを持っていなければなりません。(値は、UNIQUE であり、NULL ではない必要があります。)
359361
360362変更を適用するために2つの方法があります。
361363
362364- PrimaryKey プロパティに主キーになっているフィールド名を設定する。
363365- AutoIncフィールドを加える。(これは TSqliteDataset が自動的にそれを主キーとしてみなすので、より簡単です。)
364366
3653672つの条件のうち1つをセットしたら、以下を呼び出してください。
366368
367369``` pascal
368370ApplyUpdates;
369371```
370372
371373> **Note:** もし、両方の条件がセットされたら、主キーに相当するフィールドが更新の適用に使われます。
372374
373375> **Note:** 主キーではないフィールドを主キーに設定することは、ApplyUpdate がコールされたときにデータのロスを引き起こします。ですから、選択されたフィールドは、 Null でなく Unique であることを、それを使う前に確認してください。
374376
375377##### Master/detail のサンプル
376378
377379master/detail 関係の様々なサンプル (例えば、顧客と注文の間の関係):
378380
379381- `DataSource` プロパティを用いての一般的な SQLDB での方法 : [[MasterDetail/ja]]
380382- locate を用いた TSQLite3 に特徴的なサンプル : [[TSqlite3 Master Detail Example/ja]].
381383
382384#### 注意事項
383385
384386- 10000レコードまではテストして、上手く動きますが、TSqliteDataset はすべてのデータをメモリ上に置くため、必要なデータのみ受け取るようにしてください。(特にMemoフィールドなどに注意).
385387- 同じデータファイルに(同じファイル名のプロパティに)、いくつかのテーブル、データセットを持たせることができます。
386388- いくつかのデータセット(違うフィールドの組み合わせの)を同じテーブルから作ることができます。
387389- SQL文 で WHERE を使ってデータをフィルタすることが可能です。また、データセットのクローズおよび再オープン(あるいは、RefechData メソッドを呼ぶこと)ができます。しかし、この場合、並び順やフィールドの数は同じでなくてはなりません。
388390- 複数のテーブルから aliases や join , views などを使って複雑な SQL 文が実行可能です(これらは同じデータファイルにある必要があることに注意)。しかしこの場合、ApplyUpdate は動作しません。もし複雑なクエリをつかって、データファイルに更新を加えたければ私(Luiz Américo)にメールしてください。そうすれば、どういうふうにおこなうか、ヒントをお伝えすることができます。
389391- TSqliteDataset で生成されていない sqlite のデータファイルにファイル名を設定するときおよび、そのファイルを開くとき、一部のフィールドが正しい型を検出することが、許可されていません。これらは、string フィールドとして扱われます。
390392
391393一般的なサンプルが、SVNディレクトリの fpc/fcl-db/src/sqlite にあります。
392394
393395## 関連情報
394396
395397- [[SQLdb Tutorial1/ja]] Sqlite のためのチュートリアル
396398- [[SqlDBHowto/ja]] General SQLDB についての情報
397399- [[Working With TSQLQuery/ja]] SQLDB の TSQLQuery についての情報
398400- [SQLite site](http://www.sqlite.org)
399401
400402---
401403*From the Free Pascal wiki, page "SQLite/ja", as it stood on 2024-03-26 after a change by Ariben, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history