我想在onUpgrade()被調用時檢查數據庫中是否有特定的列。有一個簡單的方法來檢查像檢查Android SQLite數據庫中的特定列
if(database does not have specific column){
db.execSQL("ALTER TABLE table" + " ADD COLUMN column");
}
我看到一些其他的答案,Pragma Table,但我不知道如何使用它,甚至它到底是什麼了。
我想在onUpgrade()被調用時檢查數據庫中是否有特定的列。有一個簡單的方法來檢查像檢查Android SQLite數據庫中的特定列
if(database does not have specific column){
db.execSQL("ALTER TABLE table" + " ADD COLUMN column");
}
我看到一些其他的答案,Pragma Table,但我不知道如何使用它,甚至它到底是什麼了。
好吧,你遇到了更大的問題之前,你應該知道,SQLite是在ALTER TABLE命令的限制,它允許add
和rename
唯一沒有remove /下降這與娛樂做的表格。
您應始終擁有新的表創建查詢,並將其用於升級並傳輸任何現有數據。注意:onUpgrade方法爲你的sqlite幫助對象運行一個,你需要處理它中的所有表。
所以建議採取什麼onUpgrade:
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
)(這不處理表降級,如果您重命名列,你沒有得到轉移作爲列名不匹配現有的數據)。
。
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();
}
找到了解決辦法
try {
db.execSQL("ALTER TABLE notes" + " ADD COLUMN Week");
} catch (SQLException e) {
Log.i("ADD COLUMN Week", "Week already exists");
}
+1因爲這是簡單問題的簡單解決方案 – 2012-04-05 07:45:39
感謝您的細節!現在我只需要一些簡單的東西,但這太棒了!我一定會在將來使用它! – Cameron 2010-08-20 21:39:06