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