【SQLDelight】"no such column" エラーの対処法

エラー内容

KMPアプリでSQLDelightを使用していたところ、初回インストール時に以下のエラーが発生しました。

no such column: Reminder.is_completed in "SELECT Reminder.id, Reminder.text, Reminder.is_completed, Reminder.created_at, 
Reminder.forget_at FROM Reminder"

環境

  • Android API30/31 エミュレータ・実機
  • SQLDelight使用のKMPアプリ

試した解決策(効果なし)

通常のアンインストール・再インストールでは解決できませんでした。

原因

古いデータベースファイルが端末に残っていたことが原因でした。

開発中にスキーマ変更を行っていたため、見た目は「初回インストール」でも内部的に古いDBファイルが残存していました。

解決方法

エミュレータの場合

Android Studio > AVD Manager > 対象エミュレータ > Wipe Data

実機の場合

adb shell "am force-stop com.yourpackage.yourapp"
adb shell "pm clear com.yourpackage.yourapp"
adb uninstall com.yourpackage.yourapp
./gradlew clean && ./gradlew :composeApp:assembleDebug
adb install composeApp/build/outputs/apk/debug/composeApp-debug.apk

まとめ

「初回インストール」に見えても古いデータが残っている場合があります。SQLDelightのスキーマエラーが出た際は、コード修正の前に端末の完全リセットを試してみることをおすすめします。

Built with Hugo