当前位置: 首页 > 面试题库 >

将SQLite数据库从一个版本升级到另一个版本?

秦才
2023-03-14
问题内容

我从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上进行以下操作:

  • beginTransaction
  • 使用运行表创建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
  • setTransactionSuccessful

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.