栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

好的,在遇到更大的问题之前,您应该知道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();}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/486296.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号