【问题标题】:sqlite DB to-do during iphone app updateiphone 应用程序更新期间的 sqlite DB 待办事项
【发布时间】:2011-05-07 14:16:15
【问题描述】:

我有一些关于涉及 sqlite db 的 iphone 应用更新的一般性问题。

  1. 随着新的更新,现有的 sqlite db 是否会被新的副本覆盖?

  2. 如果更新不涉及任何架构更改,那么用户应该能够使用他们保存的数据重用现有数据库,对吗? (如果现有数据库没有被上面的 1 覆盖)

  3. 如果有一些架构更改,将数据从旧数据库传输到新数据库的最佳方法是什么?有人可以给我指导方针和示例代码吗?

【问题讨论】:

标签: iphone sqlite


【解决方案1】:
  1. 仅替换应用程序包中的文件。如果数据库文件位于应用程序的 Documents 目录中,则不会被替换。 (请注意,如果您更改应用程序包中的文件,代码签名将不再有效,应用程序将无法启动。因此,除非您使用只读数据库,否则它必须位于 Documents 目录中。)

  2. 是的。

  3. 什么是最好的取决于数据。你不会找到这样一个通用问题的示例代码。首先,您需要检测您的应用程序正在使用旧数据库版本运行。然后你需要升级它。

检查版本:

  • 您可以为新架构使用不同的文件名。如果 Version2.db 不存在但 Version1.db 存在,请进行升级。
  • 您可以在数据库中嵌入架构版本。我有一个名为metadata 的表,其中包含namevalue 列。我用它来存储一些通用值,包括dataversion 数字。我在打开数据库时检查该数字,如果低于当前版本,我会进行升级。
  • 除了创建表之外,您还可以使用 sqlite 的内置 user_version pragma 来检查和存储版本号。
  • 您可以直接检查表结构:查找列或表是否存在。

升级:

  • 您可以使用一系列 SQL 命令就地升级。您甚至可以将 SQL 文件作为资源存储在您的应用程序包中,然后简单地将其传递给 sqlite3_exec 以完成所有工作。 (在事务中执行此操作,以防出现问题!)
  • 您可以通过将数据从一个数据库文件复制到一个新文件来进行升级。

如果您的升级可能运行很长时间(超过一秒),您应该显示一个升级屏幕,向用户解释发生了什么。

【讨论】:

  • 关于版本检查的小提示:您也可以使用内置的“user_version”pragma (sqlite.org/pragma.html#pragma_schema_version),而不是为架构版本使用单独的表。
  • 哦,酷!我希望我知道这件事。将编辑我的答案。
  • version1.db 和 version2.db 升级等这么难?我们还有其他选择吗?
【解决方案2】:

1) 数据库文件不作为应用程序包的一部分存储,因此不会,它不会被自动覆盖。

2) 是的 - 他们的所有数据都将被保存。事实上,更新根本不会触及数据库。

3) 这是一个棘手的问题——阅读this fantastically interesting document——尤其是关于轻量级迁移的部分——如果你的架构更改很小并且遵循一组规则,它们会自动发生并且用户不会注意到。但是,如果架构发生重大变化,您将不得不编写自己的迁移代码(也在该链接中)

我总是设法自己运行轻量级迁移 - 这比自己做要容易得多。

【讨论】:

  • #3 中的链接仅适用于使用 Core Data。问题似乎是关于直接使用 SQLite。
  • 该文档是指使用核心数据进行数据迁移......我正在寻找从 sqlite db(与用户数据一起存在)直接从 sqlite db(新数据库)传输数据
【解决方案3】:

我所做的是在 Documents 目录中创建数据库的工作副本。主副本随捆绑包一起提供。当我更新应用程序时,我可以选择在工作副本上创建一个新副本,或者保留它。

【讨论】:

  • 如果您需要将数据传输到新副本怎么办?有什么示例迁移脚本可以指点我吗?
  • 我通常运行两个数据库,一个静态的,它保留所有相对静态的表,一个动态的。所以迁移通常不是问题,因为我只更新所需的数据库。迁移不是问题。
猜你喜欢
  • 2020-09-02
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 2020-12-23
相关资源
最近更新 更多