如何在DatabaseHelper onUpgrade中添加列并将预先存在的行设置为特定值?
我试过了:
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
...
if (oldVersion < 2) {
db.execSQL("ALTER TABLE " + MyTableName + " ADD COLUMN "
+ MyNewColumn + " TEXT;");
db.execSQL("UPDATE " + MyTableName + " SET " +
MyNewColumn + "=" + "value for existing;");
}
}
Run Code Online (Sandbox Code Playgroud)
但是我不认为alter已经提交了,因为它说该列不存在.有什么建议吗?
编辑:添加了一些更多的周围代码
编辑:我的错误.我只是错过了关于值部分的引用,并且关于没有列的错误让我失望,但问题是它正在寻找我没有引用的值使用的列.
添加列并不像您所展示的那样简单,因为每次升级数据库时 onUpgrade 都会运行,并且第二次添加列将会失败...如果您希望快速而肮脏地完成此操作,您可以尝试将其包装起来抓住
try {
db.execSQL("ALTER TABLE sometable ADD COLUMN newcolumn integer");
}
catch(Exception e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
更好的方法是将所有数据从表中移入临时表,删除并重新创建表,然后将数据放回其中。这是我之前使用过的示例
//Update old Table
if(DBVER< 1060){
List<String> columns = DB.GetColumns(db, "listitems");
db.execSQL("ALTER table listitems RENAME TO 'temp_listitems); ") ;
String tblListItems = "create table if not exists listitems " +
"(id integer primary key autoincrement, " +
"listid integer, " +
"itemid integer, " +
"qty integer, " +
"collected integer, " +
"qtytype integer, " +
"tabid integer); " ;
db.execSQL(tblListItems);
columns.retainAll(DB.GetColumns(db, "listitems"));
String cols = DB.join(columns, ",");
db.execSQL(String.format( "INSERT INTO %s (%s) SELECT %s from temp_%s", "listitems", cols, cols, "listitems"));
db.execSQL("DROP table 'temp_" + "listitems");
}
Run Code Online (Sandbox Code Playgroud)
这是一个链接http://www.devdaily.com/android/sqlite-alter-table-syntax-examples
| 归档时间: |
|
| 查看次数: |
3269 次 |
| 最近记录: |