✔️
Flutterでsqfliteを使って外部キー制約を使う方法
結論
-
openDatabase()
をするときに以下のことを行う-
onConfigure
引数でPRAGMA foreign_keys = ON;
を実行する -
onCreate
引数で外部キー制約を設定したテーブルを作成する
-
詳細
まず、SQLiteを使うときには外部キー制約を設定したテーブルを作るだけでは不十分です。具体的には、外部キー制約を有効にするための拡張機能を有効にする必要があります。
詳細については以下の記事をご覧ください。
その上で、外部キー制約を設定する文法を使ってテーブルを作成する必要があります。
実装例
以下のコードは複数のTODOリストを管理するときの例です。
final directory = await getApplicationDocumentsDirectory();
final path = "${directory.path}/warikan";
return await openDatabase(
path,
version: 1,
// 外部キー制約を有効にする
onConfigure: (db) async {
await db.execute('PRAGMA foreign_keys = ON;');
},
// TODOリストとそれぞれのTODOのテーブルを作る
onCreate: (db, version) async {
await db.execute(
'''
CREATE TABLE todo_list(
id INTEGER PRIMARY KEY,
title TEXT
);
''',
);
await db.execute(
'''
CREATE TABLE todo_item(
id INTEGER PRIMARY KEY,
todo_list_id INTEGER,
title TEXT,
is_done BOOLEAN,
FOREIGN KEY (todo_list_id)
REFERENCES todo_list (id)
ON DELETE CASCADE
);
''',
);
},
);
このようにすることでtodo_list
のレコードを削除すると、そのid
に紐づいたtodo_item
が削除されます。
Discussion