5

タイトルにあるように、インストール数が約1000の本番Androidアプリがあります。SQLiteでDBを変更する必要がありました。これまで、SQLiteDBのバージョンはバージョン「1」に設定されていました。

うまくいけば、コメントで以下のコードを十分に説明します。このコードは私のSQLiteOpenHelperクラスに存在するため、onUpgradeメソッドはクラスの一部です。

// Provides an upgrade path for the DB when the apps version is updated.
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        // First version of the DB was 1. Logic: each if statement will
        // alter the DB cumulatively based on the version code. So, if the
        // newVersion was version 3, there would be two if statements, one
        // for oldVersion 1 and one for oldVersion 2. oldVersion 2 will
        // contain the logic for upgrading from version 2 to 3, while
        // oldVersion 1 will contain a combination of alter statements
        // allowing the database to upgrade from version 1 directly to
        // version 3.
        if (oldVersion == 1) {
            db.execSQL("ALTER TABLE plans ADD COLUMN " + App.CURRENCYCODE
                    + " TEXT");
            Locale locale = Locale.getDefault();
            ContentValues content_values = new ContentValues();
            content_values.put(App.CURRENCYCODE, locale.toString());

            db.update(App.DBPLANS, content_values, App.ID + " > ?", new String[] {
                    "0"
            });
        }

        if (oldVersion == 2) {
            // Placeholder for next database upgrade instructions.
        }
    }

ここに落とし穴があれば教えてください。これまでのところ、正常にテストされていますが、最初のDBアップグレードを台無しにすることを非常に心配しています。私には1,000人ほどのユーザーがいるので、すべてを失いたくありません。

再度、感謝します!

4

1 に答える 1

7

このようなデータベースを更新する必要がある場合、私は通常、次のようにケースが相互に発生するswitchステートメントを使用して更新します。

switch (oldVersion) {
    case 1:
        // update to version 2
        // do _not_ break; -- fall through!
    case 2:
        // update to version 3
        // again, do not break;
    case 3:
        // you're already up to date

これの利点は、データベースを変更し続けるときに複数のifステートメントで更新ステートメントを繰り返す必要がないことです。データベース更新を追加するには、コードの複数のブロックを更新するのではなく、新しいcaseステートメントを追加するだけで済みます。

あるバージョンで追加された後、将来のバージョンで削除される列など、これには例外がある場合があります。そのため、注意を払う必要があります。

于 2012-11-02T02:05:42.910 に答える