【Flutter】driftのSetupチュートリアルで発生したエラーの対策
発生したエラー
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
の使い方を調べる際、公式のチュートリアルを試していた。
このアプリを作って実行すると以下のエラーが発生した。
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に記載されていた。
アプリをデバイスから一度アンインストールして、再度インストールするまたはマイグレーションを記載するとのこと。データベースのスキーマを更新すると、この作業が必要。
上記で記載したデータベースファイルの変更はあまりおすすめしない。
Discussion