我收到错误Logcat
说某个专栏(在我的SQLiteOpenHelper
子类)不存在。我以为我可以通过更改来升级数据库DATABASE_CREATE
细绳。但显然不是,那么我如何(逐步)将我的 SQLite 数据库从版本 1 升级到版本 2?
如果这个问题看起来“新手”,我深表歉意,但我仍在学习 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;
}
...
好的,在遇到更大的问题之前,您应该知道 SQLite 在 ALTER TABLE 命令上受到限制,它允许add
and 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();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)