2015-10-13 58 views
0

在升級期間,我想向我的數據庫添加一個新表,但是我還希望在升級應用程序時不會丟失其他表中的數據。有人可以告訴我,我該怎麼辦?如何在發佈應用程序後創建新表

有可能嗎?

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL(CREATE_GROUPS_TABLE); 
    db.execSQL(CREATE_A_GROUPS_TABLE); 
    db.execSQL(CREATE_MESSAGES_TABLE); 
    db.execSQL(CREATE_REPORTING_TABLE); 
    db.execSQL(CREATE_SUCC_SENDING_TABLE); 
    db.execSQL(CREATE_NOTIFICATIONS_TABLE); 
    db.execSQL(CREATE_RECEIVES_TABLE); // new table 
} 

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

    db.execSQL("DROP TABLE IF EXISTS " + GROUPS); 
    db.execSQL("DROP TABLE IF EXISTS " + NOTIFICATIONS); 
    db.execSQL("DROP TABLE IF EXISTS " + A_GROUP); 
    db.execSQL("DROP TABLE IF EXISTS " + MESSAGES); 
    db.execSQL("DROP TABLE IF EXISTS " + REPORTING); 
    db.execSQL("DROP TABLE IF EXISTS " + SUCC_SENDING); 
    db.execSQL("DROP TABLE IF EXISTS " + RECEIVES); //new table 
    onCreate(db); 
} 

我的新表RECEIVES


更新

當前版本1。我想將其更改爲2

public MainDB(Context context) { 
    super(context, DATABASE_NAME, null, 1); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL(CREATE_GROUPS_TABLE); 
    db.execSQL(CREATE_A_GROUPS_TABLE); 
    db.execSQL(CREATE_MESSAGES_TABLE); 
    db.execSQL(CREATE_REPORTING_TABLE); 
    db.execSQL(CREATE_SUCC_SENDING_TABLE); 
    db.execSQL(CREATE_NOTIFICATIONS_TABLE); 
    //db.execSQL(CREATE_RECEIVES_TABLE); //new table 
} 

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

    db.execSQL("DROP TABLE IF EXISTS " + GROUPS); 
    db.execSQL("DROP TABLE IF EXISTS " + NOTIFICATIONS); 
    db.execSQL("DROP TABLE IF EXISTS " + A_GROUP); 
    db.execSQL("DROP TABLE IF EXISTS " + MESSAGES); 
    db.execSQL("DROP TABLE IF EXISTS " + REPORTING); 
    db.execSQL("DROP TABLE IF EXISTS " + SUCC_SENDING); 
    // db.execSQL("DROP TABLE IF EXISTS " + RECEIVES); // new table 
    onCreate(db); 
} 

回答

3

每當模式更改時增加數據庫版本號。

OnUpgrade方法中,檢查舊版本和新版本,並編寫適合從一個版本升級到另一個版本的代碼。在發佈每個版本時,您可能會對版本號進行多次檢查,從而允許您逐步升級。從OnUpgrade方法中撥打onCreate並不是一個好習慣。這應該只用於創建數據庫

e.g 的第一次迭代假設當前/新版本是3

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

    if (oldversion<2) { 
     // Code to upgrade from V1 to V2. 
     db.execSQL(CREATE_RECEIVES_TABLE); 
    } 

    if (oldversion<3) { 
     // Code to upgrade from V2 to V3 
    } 

    // Other version checks added as needed etc. etc 

} 

任何一個有V1數據庫將有兩個執行代碼塊。而V2數據庫將只有第二個執行。添加每個版本增量的新檢查。 OnUpgrade方法中的所有代碼都在事務內部運行,因此如果它的任何部分失敗,整個數據庫將回滾到調用該方法之前的狀態。

您的OnCreate方法應始終包含用於創建數據庫的當前\ latest版本的代碼。

當前,您正在丟棄所有表並重新創建整個數據庫。這將刪除所有以前創建的數據。

更新 您的V2要求的具體代碼如下:當`OnUpgrade`方法調用`OnCreate`方法

public MainDB(Context context) { 
    super(context, DATABASE_NAME, null, 2); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    // Create V2 database. This is only called if the database does not exist 

    db.execSQL(CREATE_GROUPS_TABLE); 
    db.execSQL(CREATE_A_GROUPS_TABLE); 
    db.execSQL(CREATE_MESSAGES_TABLE); 
    db.execSQL(CREATE_REPORTING_TABLE); 
    db.execSQL(CREATE_SUCC_SENDING_TABLE); 
    db.execSQL(CREATE_NOTIFICATIONS_TABLE); 
    db.execSQL(CREATE_RECEIVES_TABLE); 
} 

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

    // OnUpgrade is called if your database exists and the version number is less than the version specified in the Constructor 

    if (oldversion<2) { 
     // Code to upgrade from V1 to V2. 
     db.execSQL(CREATE_RECEIVES_TABLE); // Add the new table only 
    } 

    if (oldversion<3) { 
     // When V3 is released, add code here to 
     // upgrade from V2 to V3 
    } 

} 
+0

我更新了我的問題。 PLZ給我正確的代碼。非常感謝。 'RECEIVES'是新表。 –

+0

這已經是正確的。它只是有額外的信息,當你想更新到V3 – Kuffs

+0

好,但當我更改版本代碼爲2時,其他表的所有數據將被刪除。我不想丟失我的數據。 –

-1

取下所有DROP TABLE的IF EXISTS命令和放置

db.execSQL(CREATE_RECEIVES_TABLE); 

在onUpgrade方法。像這樣做;

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

    db.execSQL(CREATE_RECEIVES_TABLE); 
} 
+1

這可能會拋出一個錯誤,因爲它會試圖創建表已經存在。 – Kuffs

+0

因爲onCreate沒有被調用,所以它不會被升級。 onUpgrade是..並且如果onUpgrade被調用,那麼db.execSQL(CREATE_RECEIVES_TABLE);沒有被調用(假設不在你以前的版本中),如果數據庫版本號增加並且人們擁有舊的數據庫版本,則只會調用onUpgrade而不是onCreate。您仍然需要onCreate中的創建接收表,供未升級的用戶直接下載您的應用的第2版。 – vguzzi

+0

您正在使用onupgrade方法專門調用oncreate,因此它將被稱爲 – Kuffs