⚠️

【Flutter】driftのSetupチュートリアルで発生したエラーの対策

2024/03/23に公開

発生したエラー

DriftRemoteException (SqliteException(1): while preparing statement, no such table: todo_items, SQL logic error (code 1)
Causing statement: INSERT INTO "todo_items" ("title", "body") VALUES (?, ?))

対策

以下のどれかを実施する。

  • アプリをデバイスからアンインストールして再度インストールする
  • マイグレーションを記述する
  • (これは非推奨)データベースファイル名の変更

バージョン

dependencies:
  drift: ^2.15.0
  sqlite3_flutter_libs: ^0.5.20
  path_provider: ^2.1.2
  path: ^1.8.3

dev_dependencies:
  drift_dev: ^2.15.0
  build_runner: ^2.4.8

背景

Flutterのデータベースパッケージdriftの使い方を調べる際、公式のチュートリアルを試していた。

https://drift.simonbinder.eu/docs/getting-started/

このアプリを作って実行すると以下のエラーが発生した。

DriftRemoteException (SqliteException(1): while preparing statement, no such table: todo_items, SQL logic error (code 1)...)

todo_itemsというテーブルが見つからないらしいが、build_runnerで生成されたdatabase.g.dartを見てもテーブルの名前はtodo_itemsに定義されているように見える。

String get actualTableName => $name;
static const String $name = 'todo_items';

いろいろ試した結果、_openConnection()内で定義しているデータベースのファイル名を以下のように変更して実行することでエラーは消えた。

final file = File(p.join(
  dbFolder.path,
  'my_db.sqlite', // 変更前: db.sqlite
));

この時、データベースのファイル名を変更したら以下のコマンドも実行する。

dart run build_runner build

db.sqliteが不正な状態になっていたことが推測できるが、詳しい検証はしていない。
チュートリアルで書かれた手順をなぞって実行するとエラーが出るのはなんだかなー😅

追記

上記の方法でもエラーは消えるのだが、それよりも良い方法が公式のFAQに記載されていた。

https://drift.simonbinder.eu/faq/#why-am-i-getting-no-such-table-errors

アプリをデバイスから一度アンインストールして、再度インストールするまたはマイグレーションを記載するとのこと。データベースのスキーマを更新すると、この作業が必要。

上記で記載したデータベースファイルの変更はあまりおすすめしない。

Discussion