【问题标题】:Updating new version to app store with different sqlite db structure使用不同的 sqlite db 结构将新版本更新到应用商店
【发布时间】:2012-04-25 13:08:33
【问题描述】:

我在应用商店(1.0 版)上上传了一个应用。我的应用程序使用 sqlite 数据库来存储一些数据。现在,我对数据库进行了一些更改(我在我的数据库中的一个表中添加了 2 或 3 个新列)。我想用新版本 1.1(具有不同的数据库结构)更新我的应用程序的以前版本。现在,当已经使用 1.0 版的用户将应用程序升级到 1.1 版时,数据库已经存在于应用程序沙箱中,因此,应用程序指向 1.1 版,但我的数据库仍然是旧的。如果有的话,我想拥有带有旧数据的新数据库。请帮帮我。谢谢。

【问题讨论】:

  • 在这里查看我的答案:stackoverflow.com/a/9851554/108574 了解数据库升级策略。
  • @HeShiming 谢谢哥们。但是我已经在应用商店上传了 1.0 版本,它没有元数据表(用于存储数据库版本,正如你所建议的)。现在,我想上传一个新版本,并且数据库结构发生了变化。那么,我现在该如何实现呢?
  • 该方法仍然有效。您只需要通过检查 select 语句的返回值来检查元数据表的存在。然后,如果它不存在,则创建一个。

标签: ios sqlite app-store


【解决方案1】:

您可以在启动时检查它是否是旧数据库,如果是,则有一个例程以新结构(具有临时名称)创建一个新数据库,将所有数据从旧数据库复制到新数据库,关闭旧数据库db & 删除它,关闭新的 db,重命名它,最后再次打开它以供您更新的应用程序使用。简单、快速,而且您不需要深入了解 SQLite 即可。

【讨论】:

  • 但我只想在用户从 1.0 升级到 1.1 时才做这件事。您所说的方法将在应用程序委托的 appDidFinishLaunching 方法中实现,因此,每次启动我的应用程序时都会执行这行代码。正确的???所以,我需要类似 sqlite 数据库的版本号。
  • 不是这样 - 你只需要检查数据库是否是新结构
【解决方案2】:

sqlite 支持称为 user_version 属性的东西,您可以执行PRAGMA user_version 来查询您的应用程序数据库的当前架构版本。当您的应用启动时,此查询可能会在开头写入。

要更新此用户版本,请执行以下更新查询PRAGMA user_version = version_num;

每当你创建sqlite db时,最好把这个属性user_version,这样当你将来升级时你可以查询当前值。检查它需要什么并执行剩余的更改或创建表以升级您的架构版本。

例如:

在第一个版本中,我使用 col1、col2 创建 table1

我执行 sql 来创建 table1,一旦成功完成,我执行 pragma user_version = 1。所以这将表明我当前的架构版本是 1

在未来的版本中,我添加了新的 col3,我需要将我的架构版本更改为 2

我首先查询user_version,检查它的值,如果它是1,那么你需要运行alter script来添加新列并将用户版本设置为2。

在您的情况下,由于您之前没有设置 user_version,因此很难区分新安装和升级方案。所以现在你可能假设如果 db 存在它是升级场景并执行改变脚本,如果不存在假设它是一个新的 安装场景并运行创建脚本。但是看看你是否可以使用上述 pragma 来至少在将来解决你的问题。

【讨论】:

  • 似乎是更新和维护数据库架构的好方法,我会大胆尝试一下。
猜你喜欢
  • 2020-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 2016-01-15
相关资源
最近更新 更多