✔️

Flutterでsqfliteを使って外部キー制約を使う方法

2023/02/19に公開

結論

  • openDatabase()をするときに以下のことを行う
    • onConfigure引数でPRAGMA foreign_keys = ON;を実行する
    • onCreate引数で外部キー制約を設定したテーブルを作成する

詳細

まず、SQLiteを使うときには外部キー制約を設定したテーブルを作るだけでは不十分です。具体的には、外部キー制約を有効にするための拡張機能を有効にする必要があります。
詳細については以下の記事をご覧ください。
https://zenn.dev/szkyudi/articles/a9803902806a00
その上で、外部キー制約を設定する文法を使ってテーブルを作成する必要があります。

実装例

以下のコードは複数の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