1. ホーム
  2. アンドロイド

[解決済み】SQLiteOpenHelper onCreate() / onUpgrade() はいつ実行されるのですか?

2022-03-28 11:40:36

質問

の中にテーブルを作成しました。 SQLiteOpenHelper onCreate() を受信します。

SQLiteException: no such table

または

SQLiteException: no such column

のエラーが発生します。なぜですか?

NOTE

(毎週数十件の類似した質問をまとめたものです。コミュニティWikiの質問と回答をここに掲載することで、すべての質問が良い参考文献に導かれるように試みています)

解決方法は?

SQLiteOpenHelper onCreate() そして onUpgrade() コールバックは、実際にデータベースが開かれたときに呼び出されます。 getWritableDatabase() . データベースヘルパーオブジェクト自体の作成時には、データベースはオープンされません。

SQLiteOpenHelper は、データベースファイルのバージョンを変更します。バージョン番号は int に渡される引数です。 コンストラクタ . データベースファイルでは、バージョン番号は PRAGMA user_version .

onCreate() は、データベースファイルが存在せず、作成されたばかりの時にのみ実行されます。もし onCreate() が正常に返された場合 (例外がスローされなかった場合)、 要求されたバージョン番号でデータベースが作成されたものとみなされます。暗黙の了解として SQLException の中の onCreate() を自分自身に置き換えてみてください。

onUpgrade() がコールされるのは、 データベースファイルが存在するが、保存されているバージョン番号が コンストラクタで要求されたものより低い場合のみです。そのため onUpgrade() はテーブルスキーマを要求されたバージョンに更新する必要があります。

テーブルスキーマをコードで変更する場合 ( onCreate() ) の場合、データベースが更新されていることを確認する必要があります。大きく分けて2つのアプローチがあります。

  1. 古いデータベースファイルを削除し、以下のようにします。 onCreate() が再度実行されます。この方法は、インストールされたバージョンを管理でき、データの損失が問題にならない開発時によく好まれます。データベースファイルを削除するいくつかの方法。

    • アプリケーションをアンインストールする。アプリケーションマネージャーを使用するか adb uninstall your.package.name をシェルから実行します。

    • アプリケーションデータを消去する。アプリケーションマネージャーを使用します。

  2. 以下のようにデータベースのバージョンをインクリメントします。 onUpgrade() が呼び出されます。これはより多くのコードが必要なため、若干複雑になっています。

    • データ損失が問題にならないような開発期間中のスキーマアップグレードには execSQL("DROP TABLE IF EXISTS <tablename>") を呼び出して既存のテーブルを削除し onCreate() でデータベースを再作成します。

    • リリースされたバージョンの場合、データ移行を実装するのは onUpgrade() ユーザーがデータを失うことがないように。