【发布时间】:2011-05-07 14:16:15
【问题描述】:
我有一些关于涉及 sqlite db 的 iphone 应用更新的一般性问题。
随着新的更新,现有的 sqlite db 是否会被新的副本覆盖?
如果更新不涉及任何架构更改,那么用户应该能够使用他们保存的数据重用现有数据库,对吗? (如果现有数据库没有被上面的 1 覆盖)
如果有一些架构更改,将数据从旧数据库传输到新数据库的最佳方法是什么?有人可以给我指导方针和示例代码吗?
【问题讨论】:
我有一些关于涉及 sqlite db 的 iphone 应用更新的一般性问题。
随着新的更新,现有的 sqlite db 是否会被新的副本覆盖?
如果更新不涉及任何架构更改,那么用户应该能够使用他们保存的数据重用现有数据库,对吗? (如果现有数据库没有被上面的 1 覆盖)
如果有一些架构更改,将数据从旧数据库传输到新数据库的最佳方法是什么?有人可以给我指导方针和示例代码吗?
【问题讨论】:
仅替换应用程序包中的文件。如果数据库文件位于应用程序的 Documents 目录中,则不会被替换。 (请注意,如果您更改应用程序包中的文件,代码签名将不再有效,应用程序将无法启动。因此,除非您使用只读数据库,否则它必须位于 Documents 目录中。)
是的。
什么是最好的取决于数据。你不会找到这样一个通用问题的示例代码。首先,您需要检测您的应用程序正在使用旧数据库版本运行。然后你需要升级它。
检查版本:
metadata 的表,其中包含name 和value 列。我用它来存储一些通用值,包括dataversion 数字。我在打开数据库时检查该数字,如果低于当前版本,我会进行升级。升级:
sqlite3_exec 以完成所有工作。 (在事务中执行此操作,以防出现问题!)如果您的升级可能运行很长时间(超过一秒),您应该显示一个升级屏幕,向用户解释发生了什么。
【讨论】:
1) 数据库文件不作为应用程序包的一部分存储,因此不会,它不会被自动覆盖。
2) 是的 - 他们的所有数据都将被保存。事实上,更新根本不会触及数据库。
3) 这是一个棘手的问题——阅读this fantastically interesting document——尤其是关于轻量级迁移的部分——如果你的架构更改很小并且遵循一组规则,它们会自动发生并且用户不会注意到。但是,如果架构发生重大变化,您将不得不编写自己的迁移代码(也在该链接中)
我总是设法自己运行轻量级迁移 - 这比自己做要容易得多。
【讨论】:
我所做的是在 Documents 目录中创建数据库的工作副本。主副本随捆绑包一起提供。当我更新应用程序时,我可以选择在工作副本上创建一个新副本,或者保留它。
【讨论】: