在iphone应用程序更新期间sqlite DB待办事项

时间:2010-11-09 23:42:07

标签: iphone sqlite

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

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

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

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

3 个答案:

答案 0 :(得分:20)

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

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

  3. 检查版本:

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

    要升级:

    • 您可以使用一系列SQL命令进行适当的升级。您甚至可以将SQL文件作为资源存储在应用程序包中,只需将其传递给sqlite3_exec即可完成所有工作。 (如果出现问题,请在交易中执行此操作!)
    • 您可以通过将数据从一个数据库文件复制到新数据库进行升级。

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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