1. ホーム
  2. android

[解決済み] Android: DBのバージョンアップと新規テーブルの追加

2022-08-20 05:30:26

質問

アプリのためにすでに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 になることが保証されているので、開発中にデータベースのバージョンを成層圏まで増やし続ける必要はありません...