1

既存のsqlitedbに3つの新しいテーブルを追加しようとしていますが、アップグレードが成功した後、dbバージョンが更新されないという問題が発生しています。以下は、実行されるDatabaseHelperです。

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();
}

したがって、DATABASE_VERSIONが高い最初の実行で発生するのは、最初のonUpgradeログの読み取りです。古いバージョン1新しいバージョン2db.getVersionは1です。

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

ただし、onUpgradeの実行後にデータベースに再度アクセスすると、DBのバージョン番号は更新されず、onUpgradeの最初のログでonUpgradeを実行します。古いバージョン1新しいバージョン2db.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)";

どんな助けでも大歓迎です。

ありがとう、ケビン

4

2 に答える 2

3

ではonUpgrade()drop(データを一時的なデータ構造に移行した後)既存のテーブルに移動してから、(データ構造の古いデータを使用して)新しいテーブルを作成する必要があります。そうでない場合でも、古いテーブルは引き続き存在します。

これで問題が解決しない場合は、使用しているコマンドを正確に貼り付けてください。db.execSQL()

于 2012-07-27T12:13:37.960 に答える
1

私自身の問題を修正しました。問題は、アップグレードしようとしていたのと同じ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;
    }
于 2012-07-28T18:00:56.563 に答える