将 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 FragmentTransaction 自定义动画(未知动画师名称:Translate)

    我正在尝试让自定义动画与我的片段一起使用 我已按照在线教程进行操作 但出现以下错误 java lang RuntimeException 未知的动画师名称 翻译 动画的 XML 如下
  • Android:滚动 Horizo​​ntalScrollView 时如何禁用 ScrollView 的垂直滚动?

    我正在开发一个带有带有 ScrollView 的 Activity 的 Android 应用程序 其中包含 Horizo ntalScrollView 等内容 当我触摸 Horizo ntalScrollView 时 我想禁用外部 Scro
  • 很好地处理数据库约束错误

    再一次 它应该很简单 我的任务是在我们的应用程序的域对象中放置一个具有唯一约束的特定字段 这本身并不是一个很大的挑战 我刚刚做了以下事情 public class Location more fields Column unique tru
  • 普罗米修斯指标 - 未找到

    我有 Spring Boot 应用程序 并且正在使用 vertx 我想监控服务和 jvm 为此我选择了 Prometheus 这是我的监控配置类 Configuration public class MonitoringConfig Bea
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • IntelliJ - 调试模式 - 在程序内存中搜索文本

    我正在与无证的第三方库合作 我知道有一定的String存储在库深处的某个字段中的某处 我可以预测的动态值 但我想从库的 API 中获取它 有没有一种方法可以通过以下方式进行搜索 类似于全文搜索 full程序内存处于调试模式并在某个断点处停止
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • Java整数双除法混淆[重复]

    这个问题在这里已经有答案了 方案1 int sum 30 double avg sum 4 result is 7 0 not 7 5 VS 方案2 int sum 30 double avg sum 4 0 Prints lns 7 5
  • Jersey 客户端请求中未设置 Content-Length-Header

    我正在使用 Jersey Client 访问网络服务 如下所示 response r accept MediaType TEXT PLAIN TYPE header content length 0 post String class 其中
  • Struts 2 + Sitemesh 3 集成 - FreemarkerDecoratorServlet 中的 NPE

    我将 Struts 2 版本 2 3 14 3 与 Sitemesh 3 版本 3 0 alpha 2 一起使用 并且在某些情况下遇到 NullPointerException 首先 这是我的 web xml 中的 struts2 site
  • 在 Spring 中重构这个的最佳方法?

    private final ExecutorService executorParsers Executors newFixedThreadPool 10 public void parse List
  • 我可以创建自定义 java.* 包吗?

    我可以创建一个与预定义包同名的自己的包吗在Java中 比如java lang 如果是这样 结果会怎样 这难道不能让我访问该包的受保护的成员 如果不是 是什么阻止我这样做 No java lang被禁止 安全管理器不允许 自定义 类java
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用
  • HQL Hibernate 内连接

    我怎样才能在 Hibernate 中编写这个 SQL 查询 我想使用 Hibernate 来创建查询 而不是创建数据库 SELECT FROM Employee e INNER JOIN Team t ON e Id team t Id t
  • 将 Azure AD 高级自定义角色与 Spring Security 结合使用以进行基于角色的访问

    我创建了一个演示 Spring Boot 应用程序 我想在其中使用 AD 身份验证和授权 并使用 AD 和 Spring Security 查看 Azure 文档 我执行了以下操作 package com myapp contactdb c
  • Android:AsyncTask ProgressDialog 将不会在 ActivityGroup 中打开

    我试图在轮询我的服务器时打开一个进度对话框 该类是一个 ActivityGroup 因为它嵌套在选项卡栏中 为了将视图保持在框架内 需要 ActivityGroup 这是我的 ActivityGroup 类的声明 public class
  • Java中的Object类是什么?

    什么是或什么类型private Object obj Object http download oracle com javase 6 docs api java lang Object html是Java继承层次结构中每个类的最终祖先 从
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • Trie 数据结构 - Java [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有任何库或文档 链接提供了在 java 中实现 Trie 数据结构的更多信息 任何帮助都会很棒 Thanks 你可以阅读Java特里树
  • 调整添加的绘制组件的大小和奇怪的摆动行为

    这个问题困扰了我好几天 我正在制作一个特殊的绘画程序 我制作了一个 JPanel 并添加了使用 Paint 方法绘制的自定义 jComponent 问题是 每当我调整窗口大小时 所有添加的组件都会 消失 或者只是不绘制 因此我最终会得到一个

随机推荐

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

    我有一个字符串和多个正则表达式 例如一个正则表达式检查字符串是否仅为数字 是否以字符 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