업그레이드 성공 후 Android 업그레이드 DB가 DB 버전을 업데이트하지 않습니다.

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

문제

기존 sqlite db에 세 개의 새 테이블을 추가하려고 하는데 성공적인 업그레이드 후 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 새 버전 2 db.getVersion은 1입니다.

두 번째 로그는 다음과 같습니다.onUpgrade 이후 버전은 2입니다.

그러나 onUpgrade가 실행된 후 db에 다시 액세스하면 DB의 버전 번호가 업데이트되지 않고 onUpgrade 읽기의 첫 번째 로그와 함께 onUpgrade를 통해 실행됩니다.이전 버전 1 새 버전 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 버전이 업데이트되는 것과 같이 모든 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