2012-07-27 155 views
1

我想添加三個新表到我現有的sqlite數據庫,我遇到了成功升級後不更新數據庫版本的問題。下面是運行DatabaseHelper:成功升級後Android升級數據庫不更新數據庫版本

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()函數:

​​3210

下面是我的close()函數:

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

第一所以會發生什麼運行更高DATABASE_VERSION是第一個onUpgrade日誌讀出: 舊版本1新版本2 db.getVersion是1

第二個日誌是:onUpgrade後 版本是2

但是當數據庫被再次訪問onUpgrade是跑不更新數據庫的版本號,並通過onUpgrade與第一日誌中運行後onUpgrade閱讀: 舊版本1新版本2 db.getVersion是1

然後,應用程序崩潰,因爲它嘗試創建一個已經存在的表。

我試過在onUpgrade中也沒有手動設置數據庫版本。這也沒有用。我也嘗試通過運行更新版本號...

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)"; 

任何幫助將是巨大的讚賞。

謝謝 凱文

回答

1

固定我自己的問題。問題在於我創建了一個單獨的DB助手類,它正在訪問試圖升級的相同數據庫。在這個單獨的DB幫助器類中,版本號被設置爲1.這個應用程序是我的第一個Java和Android程序,我設置了可怕的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; 
    } 
3

onUpgrade(),你必須drop現有表(數據遷移到一些臨時數據結構之後),然後創建新表(使用數據結構的舊數據)。如果你不是,舊的表格將仍然存在。

如果這不能解決問題,粘貼您正在使用的精確命令在db.execSQL()

+0

此數據庫中只有一個表,我需要遷移之前我刪除表,你知道一個很好的來源,可以幫助我看到如何做到這一點? 謝謝! – KevinM 2012-07-27 14:18:18

+0

那麼它取決於你正在存儲什麼數據,有多少列,等等。出乎我的意料之外的一種方式是使用一組'ContentValues'。獲取表格中當前所有對象的光標,並將每行放入一個「ContentValues」對象中。 '放下'表格,'創建'新表格,'插入'每個ContentValue,賓果。 – 2012-07-27 15:19:39

+0

這很有道理。我很感激幫助。我會試試看。 – KevinM 2012-07-27 15:25:11