2016-03-15 52 views
0

我正在嘗試執行數據庫遷移,其中我刪除了一個表,並在我的Android應用程序的其中一列中添加了唯一限制。如何替換SQLite中的表

我創建了新表,將原始值中的值複製到新表中,刪除了舊錶,然後將新表重命名爲與舊錶相同的名稱。

問題是,現在當我查詢數據庫中原始表名稱的值時,我從所謂的刪除表中獲取結果,而不是重新命名的新表。

我試過除了重命名新表,以驗證一切正確連接。我看到有正確列的新表。但是查詢舊錶格會給我有效的回答,而不是「表格不存在」的錯誤。

這是發生在一個測試中,我正在建立數據庫,調用onUpgrade,然後查詢狀態。

爲了重申:

  1. 創建,2列1表A,3
  2. 創建,4列1 2,表B,5
  3. 從表A中複製行表B,滴加柱3並具有用於4列和表A
  4. 獲取條目瓦特 默認值5.
  5. DROP TABLE甲
  6. 重命名錶B中第i個查詢表格中的

備用時列1,2,3:

  • 跳過步驟5
  • 還能查詢表A和B表

我是否需要進行某種類型的刷新以使丟棄的表實際丟棄?

/* Create table_a */ 
/* Populate table_a */ 
/* Create table_b */ 
/* Copy table_a contents to table_b */ 
db.execSQL("DROP TABLE IF EXISTS table_a"); 
db.execSQL("ALTER TABLE table_b RENAME TO table_a"); 

謝謝。

+0

有趣的額外注:以上面提到的備選路線,列出所有的表將不顯示錶-A – Curtor

+0

@BobMalooga請註明如何做到這一點的SQLite的[ALTER TABLE](HTTP://www.sqlite。組織/ lang_altertable.html)。 –

+0

顯示您的代碼。 –

回答

0

在過去幾天的工作過程中工作了大約8個小時,以及幾個不同的工程師在工作。對不起,我無法分享所有的細節,但我會分享我可以爲可能遇到相同問題或類似問題的任何人分享。

假設:GoogleRobolectricTestRunner使用與真實設備不同的備份數據庫,並在測試中引起緩存問題。仍然需要在真實設備上進行測試來驗證。

對新表的所有查詢都按預期工作,除非嘗試獲取新表中的列名。本來我是用下面的方法做的:

// DID NOT WORK 
public static Collection<String> getTableColumnNames(
    final SQLiteDatabase db, String tableName) { 
    try (Cursor cursor = db.query(tableName, null, null, null, null, null, null)) { 
    return Arrays.asList(cursor.getColumnNames()); 
    } 
} 

這個方法總是返回舊的被刪除表的列名。最終決定改變我們獲得列名的方式,其餘的測試都是成功的。

public static Collection<String> getTableColumnNames(
    final SQLiteDatabase db, String tableName) { 
    Set<String> columnNames = new HashSet<>(); 
    try (Cursor cursor = db.rawQuery("PRAGMA table_info(" + tableName + ")", null)) { 
    if (cursor.moveToFirst()) { 
     do { 
     columnNames.add(cursor.getString(1)); 
     } while (cursor.moveToNext()); 
    } 
    return columnNames; 
    } 
}