アップグレードが成功した後にDBバージョンを更新しないAndroidアップグレードDB

StackOverflow https://stackoverflow.com//questions/11687473

質問

私の既存のSQLite DBに3つの新しいテーブルを追加しようとしています。以下は実行されるデータベースヘルパーです:

private static class DatabaseHelper extends SQLiteOpenHelper {

    public DatabaseHelper(Context context, String name, CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.w(TAG, "Current db version is " + db.getVersion());
        db.execSQL(ORIGINAL_DATABASE_CREATE);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.w(TAG, "Old Version " + oldVersion + " New Version " + newVersion + " db.getVersion is " + db.getVersion());
        db.execSQL(NEW_TABLE_1_DATABASE_CREATE);
        db.execSQL(NEW_TABLE_2_DATABASE_CREATE);
        db.execSQL(NEW_TABLE_3_DATABASE_CREATE);
        db.setVersion(newVersion);
        Log.w(TAG, "Version after onUpgrade is " + db.getVersion());
    }       
}
.

以下のopen()関数:

public VehicleExpDbAdapter open() throws SQLException {
    mDbHelper = new DatabaseHelper(mCtx, DATABASE_NAME, null, DATABASE_VERSION);
    mDb = mDbHelper.getWritableDatabase();
    return this;
}
.

は私のclose()関数です:

public void close() {
    mDb.close();
    mDbHelper.close();
}
.

だから、データベースが高いほど最初の実行で何が起こるのかは、最初のOnUpgradeログが読み出されます。 古いバージョン1 New Version 2 DB.GetVersionは1

です。

2番目のログは次のとおりです。 OnUpgradeの後のバージョンは2

です

しかし、OnUpgradeがranされた後にDBが再びアクセスされたときにDBのバージョン番号が更新されず、onupgradeの読み込みの最初のログでonupgradeを実行します。 古いバージョン1 New Version 2 DB.GetVersionは1

です。

それでアプリは既にあるテーブルの作成を試みるのでクラッシュしました。

onupgradeでもDBバージョンを手動で設定しようとしました。これも機能しませんでした。実行してバージョン番号を更新しようとしました...

db.execSQL("PRAGMA user_version = " + newVersion);
.

... onupgradeの終わりに。

編集:

Aswin Kumarの提案私は既存のテーブルをバックアップしてすべてのテーブルをドロップしてから再作成するように私のOnUpgradeを変更しました。これは私のバージョンの問題を修正していません。以下は私のonupgradeとoncreateです:

@Override
    public void onCreate(SQLiteDatabase db) {
        Log.w(TAG, "Current db version is " + db.getVersion());

        db.execSQL(ORIGINAL_DATABASE_CREATE);

        db.execSQL(NEW_TABLE_1_DATABASE_CREATE);
        db.execSQL(NEW_TABLE_2_DATABASE_CREATE);
        db.execSQL(NEW_TABLE_3_DATABASE_CREATE);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        Log.w(TAG, "Old Version " + oldVersion + " New Version " + newVersion + " db.getVersion is " + db.getVersion());

        mOldDbContents = backupTables(db);

        db.execSQL("DROP TABLE IF EXISTS " + ORIGINAL_DATABASE_CREATE);
        db.execSQL("DROP TABLE IF EXISTS " + NEW_TABLE_1_DATABASE_CREATE);
        db.execSQL("DROP TABLE IF EXISTS " + NEW_TABLE_2_DATABASE_CREATE);
        db.execSQL("DROP TABLE IF EXISTS " + NEW_TABLE_3_DATABASE_CREATE);

        onCreate(db);
    }   
.

は、テーブルの作成に使用するSQLiteステートメントです。

private static final String ORIGINAL_DATABASE_CREATE = "create table " + VEHICLE_EXPENSE_TABLE_NAME + 
        " (" + KEY_ROW_ID + " integer primary key autoincrement, " + 
        KEY_UNIX_DATE + " integer, " + 
        KEY_DATE + " not null default current_date, " +
        KEY_TIME + " not null default current_time, " + 
        KEY_DESCRIPTION + " text, " + 
        KEY_START_MILE + " integer, " + 
        KEY_END_MILE + " integer, " + 
        KEY_MILES + " text, " + 
        KEY_AMOUNT + " text, " 
        + KEY_PARTY_ID + " integer)";

private static final String NEW_TABLE_1_DATABASE_CREATE = "CREATE TABLE " + PURCHASE_HISTORY_TABLE_NAME + 
        "(" + HISTORY_ORDER_ID_COL + " TEXT PRIMARY KEY, " +
        HISTORY_STATE_COL + " INTEGER, " + 
        HISTORY_PRODUCT_ID_COL + " TEXT, " + 
        HISTORY_DEVELOPER_PAYLOAD_COL + " TEXT, " + 
        HISTORY_PURCHASE_TIME_COL + " INTEGER)";

private static final String NEW_TABLE_2_DATABASE_CREATE = "CREATE TABLE " + PURCHASED_ITEMS_TABLE_NAME + 
        "(" + PURCHASED_PRODUCT_ID_COL + " TEXT PRIMARY KEY, " + 
        PURCHASED_QUANTITY_COL + " INTEGER)";

private static final String NEW_TABLE_3_DATABASE_CREATE = "CREATE TABLE " + TRIAL_LIMIT_TABLE_NAME + 
        "(" + TRIAL_PRODUCT_ID_COL + " TEXT PRIMARY KEY, " + 
        TRIAL_PRODUCT_NAME + " TEXT, " + 
        TRIAL_START_DATE + " INTEGER)";
.

あらゆる助けが大いに感謝されるでしょう。

ありがとう、 ケビン

役に立ちましたか?

解決 2

自分の問題を修正しました。この問題は、アップグレードしようとしていたのと同じDBにアクセスしていた別のDBヘルパークラスを作成したということでした。この別のDBヘルパークラスでは、バージョン番号が1に設定されました。このアプリは私の最初のJavaとAndroidプログラムであり、DBクラスを恐ろしく設定しました。私はすべてのDBクラスをアップグレードしているものに統合し、今私のDBバージョンはそれがそれほど更新されています。誰かが興味があるなら、以下は私の最後のクラスです。

@Override
    public void onCreate(SQLiteDatabase db) {
        Log.w(TAG, "Current db version is " + db.getVersion());

        db.execSQL(VEHICLE_EXPENSE_DATABASE_CREATE);

        db.execSQL(PURCHASE_HISTORY_DATABASE_CREATE);
        db.execSQL(PURCHASE_ITEMS_DATABASE_CREATE);
        db.execSQL(TRIAL_TIME_DATABASE_CREATE);
    }


@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        Log.w(TAG, "Old Version " + oldVersion + " New Version " + newVersion + " db.getVersion is " + db.getVersion());

        if (oldVersion < newVersion) {

            if (oldVersion == 1) {
                db = upgradeTo2(db);
            }
        }
    }

private SQLiteDatabase upgradeTo2(SQLiteDatabase db) {

        db.beginTransaction();
        try {
            db.execSQL(PURCHASE_HISTORY_DATABASE_CREATE);
            db.execSQL(PURCHASE_ITEMS_DATABASE_CREATE);
            db.execSQL(TRIAL_TIME_DATABASE_CREATE);
            db.setTransactionSuccessful();
        } catch (Exception e) {
            Log.w(TAG, "onUpgrade failed");
        } finally {
            db.endTransaction();
        }

        return db;
    }
.

他のヒント

onUpgrade()では、既存のテーブルをdrop(データを一時的なデータストラクチャに移行した後)、次に新しいテーブルを作成します(データストラクチャから古いデータを使用して)。そうでない場合は、古いテーブルがまだ存在します。

これが問題を解決しない場合は、db.execSQL()

で使用している正確なコマンドを貼り付けます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top