2010-08-20 30 views
3

我想在onUpgrade()被調用時檢查數據庫中是否有特定的列。有一個簡單的方法來檢查像檢查Android SQLite數據庫中的特定列

if(database does not have specific column){ 
db.execSQL("ALTER TABLE table" + " ADD COLUMN column"); 
} 

我看到一些其他的答案,Pragma Table,但我不知道如何使用它,甚至它到底是什麼了。

回答

6

好吧,你遇到了更大的問題之前,你應該知道,SQLite是在ALTER TABLE命令的限制,它允許addrename唯一沒有remove /下降這與娛樂做的表格。

您應始終擁有新的表創建查詢,並將其用於升級並傳輸任何現有數據。注意:onUpgrade方法爲你的sqlite幫助對象運行一個,你需要處理它中的所有表。

所以建議採取什麼onUpgrade:

  • 的BeginTransaction
  • 運行與if not exists表生成(我們正在做的升級,因此該表可能還不存在,它將無法修改和刪除)
  • 放在一個列表中的現有列List<String> columns = DBUtils.GetColumns(db, TableName);
  • 備份表(ALTER table " + TableName + " RENAME TO 'temp_" + TableName
  • 創建新表(最新表創建模式)
  • 獲得與新列的交叉點,從升級後的表採取這一時間列(columns.retainAll(DBUtils.GetColumns(db, TableName));
  • 恢復數據(String cols = StringUtils.join(columns, ","); db.execSQL(String.format( "INSERT INTO %s (%s) SELECT %s from temp_%s", TableName, cols, cols, TableName));
  • 刪除備份表(DROP table 'temp_" + TableName
  • setTransactionSuccessful

(這不處理表降級,如果您重命名列,你沒有得到轉移作爲列名不匹配現有的數據)。

public static List<String> GetColumns(SQLiteDatabase db, String tableName) { 
    List<String> ar = null; 
    Cursor c = null; 
    try { 
     c = db.rawQuery("select * from " + tableName + " limit 1", null); 
     if (c != null) { 
      ar = new ArrayList<String>(Arrays.asList(c.getColumnNames())); 
     } 
    } catch (Exception e) { 
     Log.v(tableName, e.getMessage(), e); 
     e.printStackTrace(); 
    } finally { 
     if (c != null) 
      c.close(); 
    } 
    return ar; 
} 

public static String join(List<String> list, String delim) { 
    StringBuilder buf = new StringBuilder(); 
    int num = list.size(); 
    for (int i = 0; i < num; i++) { 
     if (i != 0) 
      buf.append(delim); 
     buf.append((String) list.get(i)); 
    } 
    return buf.toString(); 
} 
+0

感謝您的細節!現在我只需要一些簡單的東西,但這太棒了!我一定會在將來使用它! – Cameron 2010-08-20 21:39:06

21

找到了解決辦法

try { 
      db.execSQL("ALTER TABLE notes" + " ADD COLUMN Week"); 
     } catch (SQLException e) { 
      Log.i("ADD COLUMN Week", "Week already exists"); 
     } 
+0

+1因爲這是簡單問題的簡單解決方案 – 2012-04-05 07:45:39

相關問題