[解決済み】SQLiteOpenHelper onCreate() / onUpgrade() はいつ実行されるのですか?
質問
の中にテーブルを作成しました。
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つのアプローチがあります。
-
古いデータベースファイルを削除し、以下のようにします。
onCreate()
が再度実行されます。この方法は、インストールされたバージョンを管理でき、データの損失が問題にならない開発時によく好まれます。データベースファイルを削除するいくつかの方法。-
アプリケーションをアンインストールする。アプリケーションマネージャーを使用するか
adb uninstall your.package.name
をシェルから実行します。 -
アプリケーションデータを消去する。アプリケーションマネージャーを使用します。
-
-
以下のようにデータベースのバージョンをインクリメントします。
onUpgrade()
が呼び出されます。これはより多くのコードが必要なため、若干複雑になっています。-
データ損失が問題にならないような開発期間中のスキーマアップグレードには
execSQL("DROP TABLE IF EXISTS <tablename>")
を呼び出して既存のテーブルを削除しonCreate()
でデータベースを再作成します。 -
リリースされたバージョンの場合、データ移行を実装するのは
onUpgrade()
ユーザーがデータを失うことがないように。
-
関連
-
[解決済み】Androidエミュレータのエラーメッセージ。"PANIC: Missing emulator engine program for 'x86' CPUS." (パニック: エミュレータ・エンジン・プログラムがありません)
-
[解決済み] [Solved] Error "File google-services.json is missing from module root folder. これがないとGoogle Services Pluginは機能しません" [重複]。
-
[解決済み】プロガードを有効にすると、タスク ':app:crashlyticsStoreDeobsDebug' の依存関係を判断できない。
-
[解決済み】ビットマップを保存する場所について
-
[解決済み] Android SDK の場所には空白を含めないでください。NDK ツールで問題が発生するためです。
-
[解決済み] Android: @drawable/picture を drawable に変換するのに失敗しました。
-
[解決済み] setBackgroundDrawable() 非推奨
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] AndroidでPythonを実行する方法はありますか?
-
[解決済み] Wi-Fi経由でAndroidアプリケーションを実行/インストール/デバッグしますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】OnFragmentInteractionListenerを実装する方法
-
[解決済み】Android Intent コンストラクタを解決できない
-
[解決済み】アンドロイドクロームブラウザのモバイルウェブアプリケーションのメニューでHTMLユニコード ☰が検出されない。
-
[解決済み】onCreateOptionsMenu(Menu メニュー)とは何ですか?)
-
[解決済み】"ビットマップが大きすぎてテクスチャにアップロードできない"
-
[解決済み】Android Studio 3.2 - com.android.tools.build:aapt2:3.2.0-4818971 を見つけられませんでした。
-
[解決済み] [Solved] java.lang.RuntimeException: アクティビティーのインスタンス化ができません ComponentInfo
-
[解決済み】android.content.ActivityNotFoundException: 明示的なアクティビティクラスを見つけることができません。
-
[解決済み] サポートされていないメソッドです。BaseConfig.getApplicationIdSuffix()がサポートされていません。
-
[解決済み] Gradleのエラーです。イベントディスパッチスレッドからの書き込みアクセスは、Android Studioでのみ許可されます。