SQLite onUpgrade 有 4 个数据库版本

2023-12-02

当我们有 4 个数据库版本并且我们在每个版本的用户表中添加了一个新字段时,执行 SQLiteOpenHelper 的 onUpgrade 方法的正确方法是什么?

变体 A: // 每个 case 后都没有“中断”,case 2 和 3 是否继续运行?

public void onUpgrade(SQLiteDatabase database, int version_old, int current_version) {
    switch (version_old) {
    case 1:
        database.execSQL(addPostcodeFieldToUserTable);
    case 2:
        database.execSQL(addGenderFieldToUserTable);
    case 3:
        database.execSQL(addEmailSubscriptionFieldToUserTable);
        break;
    }
}

变体B:

public void onUpgrade(SQLiteDatabase database, int version_old, int current_version) {
    switch (version_old) {
    case 1:
        database.execSQL(addPostcodeFieldToUserTable);
        break;
    case 2:
        database.execSQL(addPostcodeFieldToUserTable);
        database.execSQL(addGenderFieldToUserTable);
        break;
    case 3:
        database.execSQL(addPostcodeFieldToUserTable);
        database.execSQL(addGenderFieldToUserTable);
        database.execSQL(addEmailSubscriptionFieldToUserTable);
        break;
    }

但是,如果用户拥有数据库的版本 1,然后错过了版本 2,并使用版本 3 升级了应用程序,我们该怎么办?

变体 3:

public void onUpgrade(SQLiteDatabase database, int version_old, int current_version) {
    if(version_old==1 && current_version==2) {
        database.execSQL(addPostcodeFieldToUserTable);

    } else if(version_old==2 && current_version==3) {
        database.execSQL(addGenderFieldToUserTable);

    } else if(version_old==3 && current_version==4) {
        database.execSQL(addEmailSubscriptionFieldToUserTable);

    } else if(version_old==1 && current_version==3) {
        database.execSQL(addPostcodeFieldToUserTable);
        database.execSQL(addGenderFieldToUserTable);

    } else if(version_old==1 && current_version==4) {
        database.execSQL(addPostcodeFieldToUserTable);
        database.execSQL(addGenderFieldToUserTable);
        database.execSQL(addEmailSubscriptionFieldToUserTable);

    } else if(version_old==2 && current_version==4) {
        database.execSQL(addGenderFieldToUserTable);
        database.execSQL(addEmailSubscriptionFieldToUserTable);

    }
}

您还可以做的就是使 onUpgrade 成为递归调用,

public void onUpgrade(SQLiteDatabase database, int version_old, int current_version) {
switch (version_old) {
case 1:
    database.execSQL(addPostcodeFieldToUserTable);
    onUpgrade(database,version_old++,current_version);
    break;
case 2:
    database.execSQL(addPostcodeFieldToUserTable);
    database.execSQL(addGenderFieldToUserTable);
    onUpgrade(database,version_old++,current_version)
    break;
default:
    break;
}

你明白了,所以它会升级到最新版本并停止调用自己。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQLite onUpgrade 有 4 个数据库版本 的相关文章

随机推荐

  • 发送 QUERY 数据包时出错

    我试图将一些数据插入数据库 但出现此错误 发送 QUERY 数据包时出错 insertDeta conPat gt prepare insert into table1 data VALUES data insertDeta gt bind
  • 如何使用 postgres 将时间间隔转换为小时数?

    假设我有一个像这样的间隔 4 days 10 00 00 在 postgres 中 我如何将其转换为小时数 在本例中为 106 是否有函数或者我应该硬着头皮做类似的事情 extract days my interval 24 extract
  • 使用 NHibernate ISqlExceptionConverter 自定义异常

    我需要为 NHibernate 方言注册自定义异常 我已经实施并 注册了 ISqlExceptionConverter 如 NHibernate 测试中所示 但 当代码中抛出异常时 它不会被转换 我的转换代码 甚至不打电话 我的代码非常简单
  • 如何演示 sigma(i/2^i)<=2(i=1 到 n)

    如何证明以下不等式 sigma i 2 i lt 2 i 1 to n 如果我们看一下series然后它看起来像 我们认为总和的最大值为 n 无穷大 S 1 2 2 4 3 8 4 16 5 32 0 1 清楚地 S 2 1 4 2 8 3
  • Bootstrap下拉菜单点击后消失

    div class container div class dropdown col xs 8 div div
  • Jquery 如何使用美元符号? [复制]

    这个问题在这里已经有答案了 可能的重复 javascript中 符号的含义是什么 如果 Jquery 只是外部 javascript 代码 那么它如何使用美元符号 这不是要添加新的语法吗 只是一个普通变量 你可以做var 42
  • Android 11 (R) 中捕获和裁剪图像

    根据 android R 隐私政策的变化 我想为 android R 设备执行捕获和裁剪图像功能 我尝试了下面的方法 但它保存了空文件 文件正在指定文件夹中创建 但大小为 0kb 我在用着Android 图像裁剪器库来裁剪图像 public
  • 如何在 Vuejs 渲染函数中复制插槽?

    我有一个通过插槽传递内容的组件 我正在使用渲染函数来输出内容 我使用渲染函数的原因是因为我想多次复制内容 当我使用这段代码时 一切正常 render createElement return createElement div this s
  • 旋转后图像不在正确的位置(图形)

    我试图以不同的速率显示两个直径为 512untis 的旋转轮 但我无法删除以前绘制的图像图形并将旋转的图形设置在正确的位置 现在我正在以任意角度进行旋转 我尝试了 affineTransform 并获得了旋转 但很奇怪 就像所有像素都散开一
  • 如何让表单延迟显示

    编辑 Application DoEvents 这做到了 在这里找到 强制从 UI 线程更新 GUI c winforms 我想以 1 为步长增加数字 并将这些增量显示在列表视图中 以便用户看到数字递增 例如从 10 到 15 我有另一个按
  • 图像 url 未显示在网格中

    我已经为图像网址设置了网格视图 我无法在网格中看到图像 仅显示背景 然后单击网格将在下一个屏幕中播放 我做错了什么 如何实施 预先非常感谢 my code public class act extends Activity static S
  • 如何在 Matplotlib 图中的单行中获得不同的颜色?

    我正在使用 matplotlib 来创建绘图 我必须在图表中画一条线 必须根据每个点的函数定义其颜色 例如 我需要一条线 其中 2000 以下的点涂成红色 2000 以上的点涂成蓝色 我怎样才能得到这个 您知道类似的解决方案或解决方法来实现
  • 如何处理球体功能匹配?

    我正在从事徽标检测应用程序OpenCV on Android 我进行了大量搜索 发现为此目的大多数时候都使用特征检测 所以我搜索并尝试了不同的检测器和匹配器 最后我编写了一个可以很好地工作的代码ORB特征检测器 and 暴力匹配器 priv
  • Tensorflow安装错误:此平台上不支持轮子

    当我尝试通过从 Git 克隆来安装 TensorFlow 时 遇到错误 没有名为 copyreg 的模块 因此我尝试使用虚拟环境 但是 我随后遇到了这个错误 pip install https storage googleapis com
  • Sqlite 打开错误“无法打开数据库”

    在我的应用程序中 我使用日历控件来按日期存储信息 日历控件的链接 http blog webscale co in p 244 例如 当前选择的月份是 2010 年 10 月 现在 如果我切换回 2010 年 4 月并尝试返回到 2010
  • 使用java servlet将excel文件发送到客户端

    我在用阿帕奇兴趣点用于生成Excel文件输入Java Servlet getExcel 函数返回HSSFWorkbook 我想发送给客户 HSSFWorkbook wb getExcel 这是我到目前为止所尝试过的 block1 ByteA
  • 不应使用 keyup 事件的“charCode”属性。值没有意义

    HTML 代码
  • 如何获取存储在数组中的字符串长度(C)

    我如何获得下面字符串的长度以及数组大小 char str str 0 He str 1 llo str 2 Wor str 3 ld 我如何将它们存储在多维数组中 所以这个数组看起来像这样 char strstr str 的大小 str 的
  • 读取带有隐藏或不可见字符^M的csv文件

    我尝试读取包含隐藏或不可见字符的 csv 文件 但失败 文件内容如下所示 my data2 lt read table text Common name Scientific name Stuff1 Stuff2 Greylag Goose
  • SQLite onUpgrade 有 4 个数据库版本

    当我们有 4 个数据库版本并且我们在每个版本的用户表中添加了一个新字段时 执行 SQLiteOpenHelper 的 onUpgrade 方法的正确方法是什么 变体 A 每个 case 后都没有 中断 case 2 和 3 是否继续运行 p