困惑:SQLiteOpenHelper onUpgrade() 的行为如何?并与旧数据库备份一起导入?

2024-03-30

假设我有一个包含 2 列的数据库表 test_table 以及 SQLiteOpenHelper 中相应的创建脚本:

DB_VERSION = 1:
public void onCreate(SQLiteDatabase db)
{
db.execSql("CREATE table test_table (COL_A, COL_B);
}

这是最初的应用程序版本 1,已在 Play 商店中发布。

一段时间后,应用程序和所使用的数据库就会更新。 我想 SQLiteOpenHelper 类必须像这样进行调整:

DB_VERSION = 2:
public void onCreate(SQLiteDatabase db)
{
db.execSql("CREATE table test_table (COL_A, COL_B, COL_C)");
}

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSql("ALTER TABLE test_table ADD Column COL_C");
}

一段时间后,另一个应用程序更新:

DB_VERSION = 3:
public void onCreate(SQLiteDatabase db)
{
db.execSql("CREATE table test_table (COL_A, COL_B, COL_C, COL_D)");
}

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSql("ALTER TABLE test_table ADD Column COL_D");
}

--> 这就是我需要建议的地方。 如果用户安装应用程序版本 1,则他有 A 列和 B 列。 如果他随后更新到版本 2,则会触发 onUpgrade 并添加列 C。 从头开始安装的新用户通过 create 语句获取 3 列。 如果用户随后更新到版本 3,则会再次触发 onUpgrade 并添加 D 列。 但是,如果用户安装应用程序版本 1,然后跳过版本 2 的更新并更新版本 3,该怎么办?那么他就错过了

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

    {
    db.execSql("ALTER TABLE test_table ADD Column COL_C");
    }

部分且仅

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

    {
    db.execSql("ALTER TABLE test_table ADD Column COL_D");
    }

会被调用,这会导致表 test_table(COL_A, COL_B, COL_D)??

处理实时应用程序的数据库升级的正确方法是什么,这样用户就不会丢失数据? 您是否必须在 onUpgrade() 方法中检查所有可能的(旧)版本并根据该版本执行不同的 alter table 语句?

我这样问是因为在我的应用程序中,用户可以导出和导入数据,这无非是导出:复制整个数据库和导入:用备份副本数据库替换应用程序数据库。

如果用户拥有应用程序版本 1、导出数据库、升级应用程序(新数据库结构)并导入旧版本 1 备份,会发生什么情况? --> SQLiteOpenHelper 将如何表现? --> 处理数据库升级以及导入/导出功能的正确方法是什么?


处理实时应用程序的数据库升级的正确方法是什么,这样用户就不会丢失数据?您是否必须在 onUpgrade() 方法中检查所有可能的(旧)版本并根据该版本执行不同的 alter table 语句?

总的来说,是的。

一种常见的方法是进行成对升级:

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  if (oldVersion<2) {
    // do upgrade from 1 to 2
  }

  if (oldVersion<3) {
    // do upgrade from 2 to 3, which will also cover 1->3,
    // since you just upgraded 1->2
  }

  // and so on
}

例如,这大致相当于 Rails 迁移。

如果用户拥有应用程序版本 1、导出数据库、升级应用程序(新数据库结构)并导入旧版本 1 备份,会发生什么情况? --> SQLiteOpenHelper 将如何表现?

如果“复制整个数据库”,您的字面意思是 SQLite 数据库文件的完整文件副本,那么当SQLiteOpenHelper去打开恢复的备份,数据库将具有旧的模式版本并且将经历onUpgrade()像平常一样。

处理数据库升级以及导入/导出功能的正确方法是什么?

我怀疑答案是:要么通过复制整个文件来进行备份,要么也安排备份和恢复架构版本,您可以通过调用获取该版本getVersion() on a SQLiteDatabase目的。话虽这么说,我对这种情况处理得不多,可能还有更多我没有想到的问题。

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

困惑:SQLiteOpenHelper onUpgrade() 的行为如何?并与旧数据库备份一起导入? 的相关文章

  • 简单对话框中的 ViewPager

    我想在对话框中使用 ViewPager 但失败了 这是所有代码 对话框中显示两个片段 Layouts main xml
  • 您的手机中未安装应用程序

    我在模拟器中运行该应用程序 它成功运行 并且应用程序的图标显示在模拟器菜单中 但是当我尝试从模拟器菜单再次运行该应用程序时 它不允许我从中运行并显示 Toast 您的手机中未安装应用程序 在图像中 红色圆形是我的应用程序图标 如果您有您的M
  • 从 Eclipse 导出后,WAR 文件中缺少一些必要的库 - 为什么?

    我接手了一个大学的项目 其中包含一些 Web 服务 通过将项目导出为 WAR 文件 一些库包含在文件中 例如 Axis2 而另一些则不包含 hibernate JDBC 驱动程序 另外 添加到类路径中的 jar 尚未导出 所有库都位于硬盘驱
  • FCM:无法实例化接收器 com.google.firebase.iid.FirebaseInstanceIdReceiver:

    仅在 Oreo 8 0 中接收推送通知时应用程序崩溃 java lang RuntimeException Unable to instantiate receiver com google firebase iid FirebaseIns
  • Mediaplayer 播放几次后停止播放

    我有一个按钮 按下它会播放一个随机声音剪辑 然后播放另一个声音剪辑 然后通过一个媒体播放器播放另一个声音剪辑 但是多次按下该按钮 15 20 次 后 所有音频都会停止 我在播放最后一个音频剪辑后释放媒体播放器 所以我不认为这是原因 有什么指
  • 错误:链接引用失败。 -> 排队作业

    我正在使用 Kotlin 学习 Android Material Design 一切都很顺利 直到我尝试使用 android support design widget FloatingActionButton 当我重建项目时 我收到以下错
  • WebView 与 Chrome 自定义选项卡

    我正在构建一个应用程序 在详细活动中我必须显示一个网页 我本来打算使用 WebView 但后来我看到了 Chrome Custom Tab 你们认为最好实施什么 为什么 如果您只想显示某个页面 那么我建议您使用 chrome 自定义选项卡
  • 尝试拍摄 https://github.com/appsthatmatter/GraphView 的图表快照时出现 IllegalStateException

    我正在尝试拍摄 GraphView 的快照 但它给出了错误 GraphView 必须在硬件加速模式下使用 我正在使用以下代码来拍摄快照 Bitmap bitmap Bitmap createBitmap view getWidth view
  • 如何从android中的webview获取选定的文本?

    我需要从网络视图中获取选定的文本 为此 我这样说 webView loadUrl javascript Android getHtml window getSelection toString 在我的触摸事件中 触摸事件效果很好 Andro
  • MediaStyle 通知未响应 RemoteControl 事件。

    我们正在将正在进行的播放通知迁移到 Lollipop 中引入的 MediaStyle 通知 RemoteControlClient 似乎已被弃用 并且 MediaStyle 通知不处理媒体按钮事件 例如通过耳机远程暂停 播放 有人得到这个工
  • 将可渲染节点(相同的旋转、位置和比例)替换为 Sceneform sdk 中的另一个可渲染节点

    我是 Android 版 sceneform sdk 的新手 我已经添加了一个Transformable Node 然后我应用了一些旋转 缩放并改变了它的位置 现在 单击按钮后 我需要放置具有相同旋转 缩放和位置的第二个节点 为此我所做的是
  • 实施材质主题时遇到问题

    我在用this http antonioleiva com material design everywhere 作为在 Android 5 0 之前的设备上向现有应用程序实施 Material 主题的教程 我的问题是我得到了Null Po
  • 删除对象时删除嵌套字段中的索引

    我仍在使用 Firebase 这次我有一个与删除对象相关的问题 我有如下结构 users UsErId1 name Jack email email protected cdn cgi l email protection UsErId2
  • 当 Android 上的脸部靠近屏幕时,以编程方式关闭屏幕

    我的应用程序是一个拨号器 当用户将手机靠近头部时 我需要关闭屏幕并防止单击控件 就像本机 Android 拨号器行为一样 我需要什么 API 级别以及如何以正确的方式做到这一点 我通过反汇编一个非常著名的 VoIP 应用程序找到了解决方案
  • webView.loadUrl 显示空白屏幕

    我必须加载这些通过使用下面的代码 但最终显示空白屏幕作为输出 您可以检查url代码之间的链接位于last line WebPagerLoader java public class WebPageLoader extends Activit
  • 对话框片段中的 onActivityResult

    我正在从对话框片段中拍照 我还需要类似的东西startActivityForResult takePictureIntent actionCode Override public void onActivityResult int requ
  • 图标和导航视图之间的左边距

    我必须在图标和图标之间添加左边距NavigationView 如下图中箭头所示 我知道根据谷歌规范 这个边距必须有16dp但我需要改变它 我努力了
  • Android 上的 Facebook 深度链接

    我正在尝试在我的应用程序上实现 Facebook 的深度链接功能 并遇到了以下情况 我有一个名为 MainActivity 的活动 其声明如下
  • 在edittext android中插入imageview

    我想将 imageview 放在 edittext 中 可能吗 我检查了 evernote 应用程序 它能够将照片放在编辑文本部分 我想让我的应用程序完全相同 我如何才能将从图库中选择的图像视图放入编辑文本中 我首先尝试将 imagevie
  • 在应用程序的所有活动中重用操作栏

    我创建了一个 MenuActivity 它有一个操作栏和一个拆分操作栏 我想将此操作栏和 splitactionbar 视图用于我的应用程序中的所有活动 我是 android 的新手 所以有人可以逐步指导我 另外 我试图将搜索图标放在操作栏

随机推荐

  • 如何在 Symfony2 中创建 IP 黑名单?

    是的 我知道有食谱中的选民教程 http symfony com doc 2 0 cookbook security voters html 但我正在寻找稍微不同的东西 我需要两层不同的黑名单 拒绝某些IP访问整个网站 拒绝某些IP登录 我
  • For 循环中的 DispatchGroup

    因此 我花了一些时间尝试让 DispatchGroup 在长时间异步操作完成之前阻止 for 循环迭代 我发现的大多数示例都相当简单明了 但我似乎无法让我的简单测试用例按我的预期工作 let group DispatchGroup for
  • Fabric.js:如何将自定义尺寸设置为 Text 或 IText?

    我正在使用优秀的 Fabric js 在画布上绘制一些文本 当我为 IText 对象指定自定义大小 假设为 200x200 矩形 时 Farbric js 似乎强制对象的宽度和高度适合文本 var t new fabric IText He
  • 无法使用 Web Video Kit API 将视频发布到 Tiktok

    我正在尝试使用此端点将视频上传到 Tiktok https open api tiktok com share video upload https open api tiktok com share video upload 按照官方文档
  • 将数据放入 EBS 支持的 EC2 实例中

    我创建了一个 AWS EC2 实例并向其附加了一个 EBS 卷 我已经在上面安装了 LAMP 堆栈和 phpmyadmin 我还可以使用 Cyber duck 使用公钥 私钥 初始化与其的 SFTP 连接 并将一些 html php 文件上
  • CMAKE:更新函数中的列表不起作用

    我跟着this https stackoverflow com questions 22487215 cmake function parameter and return and this https stackoverflow com
  • 在 javascript 中使用正则表达式无效组错误

    我有以下正则表达式来检查多种类型的电子邮件地址输入 W
  • Windows 8 下的 WPF 和 Silverlight 的未来会怎样?

    看到首次发布 HTML5 JS Windows 8 GUI http windows8news com 2011 06 02 microsoft unveil windows 8 tablet ui 大量的WPF 和 Silverlight
  • 如何在 pycaffe 中获取图层类型?

    是否有可能在 pycaffe 中获取每一层的类型 例如 卷积 数据等 我搜索了提供的示例 但找不到任何内容 目前我正在使用图层名称来完成我的工作 这是非常糟糕和有限的 这很容易 import caffe net caffe Net path
  • 使用curl PHP获取gzip压缩的XML文件时出现问题

    我正在尝试使用curl 从 xml gz 文件中获取数据 我可以下载该文件 但我的任何尝试都无法获取可用的 XML 当我尝试打印 XML 时 我收到一长串乱码特殊字符 例如 r 7 E i 5 6 DL u 有没有一种简单的方法来解压缩和编
  • Ruby 模除法

    所以我用一个模块编写了一个在 Ruby 中进行模除法的程序 module Moddiv def Moddiv testfor op1 op2 return op1 op2 end end Program require mdivmod pr
  • 让 UIButton 充当导航控制器

    如何使常规 UIButton 充当导航控制器 以便按下它时我可以打开一个新视图 按照以下方式在 viewDidLoad 方法中创建 yourButton UIButton yourButton UIButton buttonWithType
  • bitbucket-pipelines.yml 文件中的部署环境“暂存”在管道中多次出现

    我正在尝试让 Bitbucket Pipelines 执行定义部署区域的多个步骤 当我这样做时 我收到错误 配置错误您的部署环境 暂存 bitbucket pipelines yml 文件在管道中出现多次 请参阅我们的文档以了解有效的环境及
  • 在 Play 应用程序中启动时调用服务

    我有一个 Play 2 4 应用程序 尝试在应用程序启动时启动每周任务 当前的建议是在急切注入的类的构造函数中执行此操作 Guice 但是 我的任务需要访问服务 如何将该服务注入到我的任务中而不出现错误 Error injecting co
  • iOS 10 问题:即使设置了 ContentSize,UIScrollView 也不滚动

    UPDATE 这是 iOS 10 的问题 这在 iOS 9 中仍然像以前一样有效 当你设置时它就会起作用contentSize在主线程上并将此代码放入 void viewDidLayoutSubviews void viewDidLayou
  • Excel COUNTIF 特殊字符

    是否可以计算整列中的特定特殊字符 我正在尝试数所有逗号 在一个专栏中 这就是我正在使用的 COUNTIF D3 D45 问题是这仅计算单元格中单独的逗号 如果我在单元格中添加任何其他内容 在逗号之前或之后 则不会计数 我正在计数的细胞示例
  • Datanode 在单机上的 Hadoop 中失败

    我使用以下教程在 ubuntu 12 04 LTS 上设置并配置了 sudo 节点 hadoop 环境http www michael noll com tutorials running hadoop on ubuntu linux mu
  • 哪些事件附加到元素?

    如何接收附加到元素的所有事件dojo http dojotoolkit org dojo query mydiv which events does mydiv has 获取 DOM 元素上的所有事件 Get my div myDiv do
  • 复制时谁负责释放数组中的对象?

    在 Objective C 中 如果使用 mutableCopy 将 array1 复制到 array2 并且假设代码在 main 中完成 那么谁负责释放数组中包含的对象 是main 还是array2 我觉得前面的回答都没有抓住重点 或者说
  • 困惑:SQLiteOpenHelper onUpgrade() 的行为如何?并与旧数据库备份一起导入?

    假设我有一个包含 2 列的数据库表 test table 以及 SQLiteOpenHelper 中相应的创建脚本 DB VERSION 1 public void onCreate SQLiteDatabase db db execSql