我从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
并且rename
不允许通过重新创建表进行删除/删除操作。
您应该始终手头有新的表创建查询,并将其用于升级和传输任何现有数据。注意:onUpgrade方法为sqlite辅助对象运行一个,并且您需要处理其中的所有表。
那么建议在Upgrade上进行以下操作:
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();
}
我的grails应用程序在生产中使用h2嵌入式数据库,最近我决定将其从grails 2.3升级到2.4。在开发模式下运行良好,但在部署到tomcat后,我提到了一些问题,例如,用户计数有问题,ApplicationContext无法用getBean加载我的服务等。我检查了日志,发现了以下错误: org.springframework.beans.factory。BeanCreationExcept
问题内容: 如何从一个数据库复制到另一个数据库。 数据库名称visco 我想将所有表从visco数据库复制到新数据库名称作为neptune 我创建了一个没有任何表的数据库,然后尝试从database1.bak文件还原数据库,然后显示错误为 需要查询帮助 问题答案: 使用SQL Server Management Studio: 选项1 ->右键单击要复制的数据库 ->选择“任务”>“生成脚本” -
我目前正在做一个项目,我需要帮助。 我想发送的名称,总数量和总价的一个产品的数量在我的添加到购物车活动。 @override public void onListClick(final ItemInfo item){ 上面应该有什么代码发送到购物车活动?? toast.maketext(mainactivity.this,“added To cart”,toast.length_short).sh
我们最近收到一封来自AWS的邮件: 主题:[需要的操作]关于简单电子邮件服务的重要通知(SIGv2弃用) 正文:我们最近观察到来自您帐户的Amazon SES SMTPendpoint上的签名版本2请求 问题: 我们没有使用AWS SES API发送请求,我们只是使用SmtpClient发送电子邮件。此方法不提供签名请求。他们自己的例子不包括任何签名。https://docs.aws.amazon
问题内容: 我有两个数据库,一个叫做,一个叫做。由于我想练习插入,更新内容,因此我想将某些表从复制到。 我要复制的表称为: 我试图做的是(使用SSMS)右键单击表格,但其中没有“复制”! 问题答案: 假设您有两个数据库,例如A和B: 如果目标表不存在,将创建以下脚本(我不建议这样): INTO COPY_TABLE_HERE FROM A.dbo.table_from_A table_A 如果目标
请阅读相应的升级注意事项。 从 2.2.5 升级到 2.2.6 从 2.2.4 升级到 2.2.5 从 2.2.3 升级到 2.2.4 从 2.2.2 升级到 2.2.3 从 2.2.1 升级到 2.2.2 从 2.2.0 升级到 2.2.1 从 2.1.4 升级到 2.2.0 从 2.1.3 升级到 2.1.4 从 2.1.2 升级到 2.1.3 从 2.1.1 升级到 2.1.2 从 2.1.