[解決済み] Android: DBのバージョンアップと新規テーブルの追加
質問
アプリのためにすでにsqliteテーブルを作成しましたが、今、データベースに新しいテーブルを追加したいです。
DBのバージョンは以下のように変更しました。
private static final int DATABASE_VERSION = 2;
と、テーブルを作成するための文字列を追加
private static final String DATABASE_CREATE_color =
"CREATE TABLE IF NOT EXISTS files(color text, incident_id text)";
onCreate
そして
onUpgrade
を以下のようにします。
@Override
public void onCreate(SQLiteDatabase database) {
database.execSQL(DATABASE_CREATE_incident);
database.execSQL(DATABASE_CREATE_audio);
database.execSQL(DATABASE_CREATE_video);
database.execSQL(DATABASE_CREATE_image);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//drop table and add new tables when version 2 released.
db.execSQL(DATABASE_CREATE_color);
}
しかし、何らかの理由で新しいテーブルが作成されません。何が間違っているのでしょうか?
どのように解決するのですか?
1. onCreate()、onUpgrade()について。
onCreate(..)
は、アプリが新しくインストールされるたびに呼び出されます。
onUpgrade
はアプリがアップグレードされて起動するたびに呼び出されます。
データベースのバージョン
が同じでない場合に呼び出されます。
2. dbバージョンのインクリメント
のようなコンストラクタが必要です。
MyOpenHelper(Context context) {
super(context, "dbname", null, 2); // 2 is the database version
}
重要:アプリのバージョンを上げるだけでは
onUpgrade
を呼び出すには十分ではありません。
3. 新しいユーザーを忘れるな!
を追加することを忘れないでください。
database.execSQL(DATABASE_CREATE_color);
をonCreate()メソッドに追加する必要があります。
4. 時間経過による複数のデータベース変更に対処する方法
アプリのアップグレードが連続し、そのうちのいくつかがデータベースのアップグレードを伴う場合、必ずチェックしたいのが
oldVersion
:
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch(oldVersion) {
case 1:
db.execSQL(DATABASE_CREATE_color);
// we want both updates, so no break statement here...
case 2:
db.execSQL(DATABASE_CREATE_someothertable);
}
}
この方法では、ユーザーがバージョン 1 からバージョン 3 にアップグレードする場合、両方のアップデートを取得します。 ユーザーがバージョン 2 からバージョン 3 にアップグレードするときは、リビジョン 3 のアップデートを取得するだけです...。 結局のところ、アップデートをリリースするたびに、ユーザーの 100% がアップグレードしてくれるとは限りません。 時には、アップデートをスキップしたり、12 回スキップしたりすることもあります。)
5. リビジョン数を管理しながら開発する
そして最後に...電話
adb uninstall <yourpackagename>
は、アプリを完全にアンインストールします。 再度インストールすると、必ず
onCreate
になることが保証されているので、開発中にデータベースのバージョンを成層圏まで増やし続ける必要はありません...
関連
-
[解決済み] Androidのgravityとlayout_gravityの違いは何ですか?
-
[解決済み] ArrayAdapter<myClass> の使用方法
-
[解決済み] getApplication()、getApplicationContext()、getBaseContext()、someClass.thisの違いと使い分け。
-
[解決済み] handler.postDelayed()を停止する。
-
[解決済み] Android - Snackbar vs Toast - 使い方と違い。
-
[解決済み] AndroidでTextViewの下にアンダーラインを引くには
-
[解決済み] EditTextの右側のDrawableにonClickListenerを設定する [重複] [重複
-
[解決済み] キャンバスに複数行のテキストを描画する
-
[解決済み] グリッドビューの高さが削減される
-
[解決済み] アンドロイドボタンセレクター
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] android: imageview の画像を画面に合わせて伸縮させる
-
[解決済み] プログラム的に電話をかけるには?
-
[解決済み] プログラムでソフトキーボードを開く
-
[解決済み] CardView layout_width="match_parent "が親のRecyclerViewの幅と一致しない。
-
[解決済み] wrap_contentでRelativeLayoutがフルスクリーンになってしまう
-
[解決済み] DialogFragmentを正しく終了させるには?
-
[解決済み] Android StudioからADBを手動で再起動する方法
-
[解決済み] 非推奨のandroid.support.v4.app.ActionBarDrawerToggleの置き換え方法
-
[解決済み] サポートライブラリのアクションバーをPreferenceActivityに追加するには?
-
[解決済み] ブルートゥースアプリケーションのテストにアンドロイドエミュレータを使用するには?