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

2023-12-21

我收到错误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 and rename只是没有通过重新创建表来完成删除/删除。

您应该始终拥有新的表创建查询,并使用它来升级和传输任何现有数据。注意:onUpgrade 方法为您的 sqlite 辅助对象运行一个方法,您需要处理其中的所有表。

那么关于升级的推荐:

  • 开始交易
  • 运行表创建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();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 SQLite 数据库从一个版本升级到另一版本? 的相关文章

  • 是否可以通过 Android 应用程序来录音?

    我是一名开发人员 希望创建一个 Android 应用程序来记录电话 这是出于我个人的需要 为了我自己的目的和记录而记录电话 是否有可能做到这一点 是否可以访问麦克风以及通过扬声器发出的声音 我对 Android 开发有点陌生 所以请耐心等待
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • org/codehaus/plexus/archiver/jar/JarArchiver(不支持的major.minor版本49.0)-Maven构建错误

    下午大家 我在尝试构建项目时收到上述错误 我很确定这与使用 Java 1 6 编译的 Maven 最新更新有关 而我们尝试构建的项目是 1 4 项目 在此之前的插件工作没有问题 因此我将以下内容添加到 POM xml 文件中以尝试强制使用现
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • Android 上的 MIDI:Java 和/或 AIR 库

    一段时间以来 我一直在考虑在 iPad 上 重新 构建一个应用程序 其中我将使用 Objective C 和DSMI http dsmi tobw net 将 MIDI 信号发送到主机 这还不错 我的意思是 除了实际编写应用程序之外 现在我
  • 如何将 Android 添加到 Phonegap 平台版本 3

    经过大量挖掘 我相信这个问题 https stackoverflow com questions 18423444 phonegap 3 doesnt work with andriod studio与我没有添加任何用于构建phonegap
  • 如何为我的 Android Market APK 创建证书?

    我想将我的第一个 APK 应用程序上传到 Android Market 但我收到了此错误 顺便说一下 在 stackoverflow 中搜索时并没有引导我找到正确的链接 市场不接受使用调试证书签名的 APK 创建有效期至少 50 年的新证书
  • Java、Spring:使用 Mockito 测试 DAO 的 DataAccessException

    我正在尝试增加测试覆盖率 所以我想知道 您将如何测试 DAO 中抛出的 DataAccessExceptions 例如在一个简单的 findAll 方法中 该方法仅返回数据源中的所有数据 就我而言 我使用 Spring JdbcTempla
  • 在运行时更改用作背景的 Drawable xml 内的形状纯色

    我有一个 Drawable xml 文件 background xml
  • 移动设备上的 TensorFlow(Android、iOS、Windows Phone)

    我目前正在寻找不同的深度学习框架 特别是用于训练和部署卷积神经网络 要求是 它可以在带有 GPU 的普通 PC 上进行训练 但训练后的模型必须部署在三个主要的移动操作系统上 即 Android iOS 和 Windows Phone Ten
  • 如何从日期中删除毫秒、秒、分钟和小时[重复]

    这个问题在这里已经有答案了 我遇到了一个问题 我想比较两个日期 然而 我只想比较年 月 日 这就是我能想到的 private Date trim Date date Calendar calendar Calendar getInstanc
  • 我们如何测试包私有类?

    我正在看书Effective Java in Item 13 Minimize the accessibility of classes and members 它提到 为了方便测试 您可能想让类 接口或成员更易于访问 这在某种程度上是好的
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • Android SearchView 在启动时隐藏键盘

    我有一个小问题正在尝试解决 当我打开应用程序时 键盘会显示输入搜索视图的查询 不过 我只想在单击搜索视图时显示键盘 我该如何解决 Thanks 这对我有用 用于隐藏焦点的代码 searchView SearchView view findV
  • Unity c# 四元数:将 y 轴与 z 轴交换

    我需要旋转一个对象以相对于现实世界进行精确旋转 因此调用Input gyro attitude返回表示设备位置的四元数 另一方面 这迫使我根据这个四元数作为默认旋转来计算每个旋转 将某些对象设置为朝上的简单方法如下 Vector3 up I
  • 如何在android中通过蓝牙向配对设备发送短信?

    在我的应用程序中 我想通过蓝牙发送和接收短信 我可以在列表视图中看到配对设备名称和地址的列表 但是当我尝试向配对设备发送文本时 什么也没有发生 在其他设备中没有收到文本 这是我向配对设备发送消息的代码 private void sendDa
  • 使用 Java https 上传到 Imgur v3 错误

    我目前正在尝试使用他们当前的 API v3 上传到 imgur 但是我不断收到错误 错误 javax net ssl SSLException 证书中的主机名不匹配 api imgur com imgur com OR imgur com
  • 使用 JFreeChart 为两个系列设置不同的 y 轴

    我正在使用 JFreeChart 使用折线图绘制两个数据系列 XYSeries 复杂的因素是 其中一个数据系列的 y 值通常远高于第二个数据系列的 y 值 假设第一个系列的 y 值约为数百万数量级 而第二个数据系列的 y 值约为数百万数量级
  • Android MulticastSocket.joinGroup 不会触发发送 IGMP 消息

    Code MulticastSocket s new MulticastSocket InetAddress addr InetAddress getByName 230 230 230 1 s joinGroup addr 在 Ubunt
  • 即使调整大小,如何获得屏幕的精确中间位置

    好的 这个问题有两部分 当我做一个JFrame 并在其上画一些东西 即使我将宽度设置为 400 并使其在一个项目击中它时 当然 允许项目宽度 它会反弹回来 但由于某种原因 它总是偏离屏幕约 10 个像素 有没有办法解决这个问题 或者我只需要

随机推荐

  • 使用正则表达式将字符串映射到功能

    我有一个字符串和多个正则表达式 例如一个正则表达式检查字符串是否仅为数字 是否以字符 X 开头等等 根据正则表达式的匹配情况 我运行不同的代码 如下所示 if Regex IsMatch myString regex1 number els
  • JBoss 无法从 Eclipse 启动

    我最近从 Netbeans 和 GlassFish 迁移到 Eclipse 和 JBoss 我已经安装了 eclipse jboss 工具 并且服务器运行时设置正确 至少据我所知 我遇到的问题是 每当我尝试从 Eclipse 启动 JBos
  • 如何使 Realm (iOS) 中的写入操作同步?

    作为两步分析过程的一部分 我需要在第二步开始之前将数据写入持久存储 如果我通过 finagrain 通知异步执行此操作 则有点混乱 如果两个人在一个函数中内联完成这件事那就太好了 是否可以使 Realm write 操作同步 第二步需要读回
  • Android 活动 onDestroy() 在屏幕锁定时调用

    销毁时当屏幕休眠或屏幕锁定时 我的活动类中的函数会被调用 我知道这种情况不应该发生 因为控制流程应该是 onPause gt onStop 锁定屏幕上的控制流程如下 onPause gt onStop gt onDestroy 我给了and
  • gitlab CI:加载密钥时出错:格式无效

    两天以来我一直被这个问题困扰 尝试使用我的生产服务器中的 id rsa pub 和 id rsa 仍然出现相同的错误 SSH PRIVATE KEY 是我在 GitLab 上的 CI CD 设置中创建的变量 编辑 未受保护 未屏蔽 This
  • 是否可以将所有权从 void* 转移到 unique_ptr?

    我目前正在使用dlopen一些插件项目的功能 该函数句柄返回一个void 然后我将所有句柄保存到名为的地图中handles void handle dlopen path c str RTLD LAZY handles file handl
  • Android 的 Webkit 组件

    除了标准 WebView 之外 Android 是否还有 Webkit 组件 类 我已经受够了它的超级非禁用选项 例如触摸时图像抖动等 我正在寻找一个足够容易嵌入到 hello world 应用程序中的组件 因为我是 Android 开发的
  • solana web3 verifyTransaction @deprecated 使用 TransactionConfirmationConfig 示例

    使用此代码 VS 显示不推荐使用的警告 方法 Connection confirmTransaction 策略 字符串 承诺 承诺 Promise 1 重载 deprecated 相反 使用 交易确认配置 签名 策略 字符串 承诺 承诺 P
  • 按星期几过滤

    我有一个列需要按星期几进行过滤 该列的格式为 00 00 yyyy 06 09 2017 现在我必须每周二进行过滤 我需要一种只能显示星期二数据的语法 我没有 isdate 列有的星期几列 00 00 0000 我正在使用 Oracle 和
  • VisualVM 无​​法在 Eclipse 上分析 Web 应用程序

    我想分析一下在 Tomcat 和 Eclipse 上运行的 Spring Web 应用程序 我将 VisualVM 添加到 Eclipse 中 并按照以下步骤运行应用程序进行分析 Right click on the application
  • jquery 动画滚动顶部回调

    我有以下 jquery 将页面滚动到顶部 然后执行回调函数 问题是 即使页面已经位于顶部 它仍然会等待 1000 过去后再执行回调 这是我不希望的 html animate scrollTop 0 1000 swing function d
  • ng-init json 对象

    我使用 angularjs ng init 我想将值赋给变量作为 jsonObj 我尝试了这个 但它不起作用 ng init percentObj value 40 color F5A623 value 60 color F5A623 还有
  • 在嵌套 for 循环内创建小部件

    我无法访问内部 for 循环中的外部 for 循环计数器 关于如何做到这一点有什么想法吗 class buildsubcategories extends StatelessWidget List
  • 配置:错误:在 Linux Ubuntu 上为 Android 编译 python 时,C 编译器无法创建可执行文件

    几天前我已经为 android 文件夹创建了 python 但忘记包含一些模块 所以我只是想再做一次 这是 distribute sh 的结果 Python build finished but the necessary bits to
  • 如何使用 script/rails 生成添加新操作和视图?

    有什么方法可以为现有控制器生成新的操作和视图 我尝试对现有控制器执行以下操作 script rails 生成控制器帖子视图 where view是我想添加到控制器的新操作 我知道用手做这件事很简单 但我想知道这是我不知道或我梦想太多的事情
  • SQL:检查一个数字是否在多个范围内

    假设我们有 2 张桌子 Table Values Id Group Value A X 15 B Y 55 Table Ranges Group LowLimit HighLimit X 0 10 X 20 30 Y 30 40 Y 50
  • UITextView 末尾的省略号

    如果我有多行不可滚动的 UITextView 其文本长度超出了可见区域的容纳范围 那么文本就会像这样被切断 Congress shall make no law respecting an establishment of religion
  • 理解 scipy 反卷积

    我试图理解scipy signal deconvolve https docs scipy org doc scipy 0 15 0 reference generated scipy signal deconvolve html 从数学的
  • 当用户移动时在 Android 谷歌地图中绘制折线

    嘿 我是 Android 新手 我已经了解了 android 谷歌地图 我想跟踪用户移动并在 android 谷歌地图中实时绘制折线路径 有人可以帮助我这个例子吗 我可以获得位置变化间隔 但仍然不知道如何将其应用到折线并将数据 LatLng
  • 将 SQLite 数据库从一个版本升级到另一版本?

    我收到错误Logcat说某个专栏 在我的SQLiteOpenHelper子类 不存在 我以为我可以通过更改来升级数据库DATABASE CREATE细绳 但显然不是 那么我如何 逐步 将我的 SQLite 数据库从版本 1 升级到版本 2