Moh*_*nde 14 java sqlite android upgrade
我收到一个错误,Logcat
说某个列(在我的SQLiteOpenHelper
子类中)不存在.我以为我可以通过更改DATABASE_CREATE
字符串来升级数据库.但显然不是,那么我如何(逐步)将我的SQLite数据库从版本1升级到版本2?
如果问题看起来像"noobish",我很抱歉,但我仍然在学习Android.
@ Pentium10这是我在onUpgrade中所做的:
private static final int DATABASE_VERSION = 1;
....
switch (upgradeVersion) {
case 1:
db.execSQL("ALTER TABLE task ADD body TEXT");
upgradeVersion = 2;
break;
}
...
Run Code Online (Sandbox Code Playgroud)
Pen*_*m10 47
好的,在你遇到更大的问题之前你应该知道SQLite在ALTER TABLE命令上是有限的,它允许add
并且rename
只允许删除/删除,这是通过重新创建表来完成的.
您应始终拥有新的表创建查询,并将其用于升级和传输任何现有数据.注意:onUpgrade方法为您的sqlite帮助程序对象运行一个,您需要处理其中的所有表.
那么推荐使用什么升级:
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();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
17159 次 |
最近记录: |