我有一些关于涉及 sqlite 数据库的 iphone 应用程序更新的一般性问题。
随着新的更新,现有的 sqlite 数据库是否会被新数据库的副本覆盖?
如果更新不涉及任何架构更改,那么用户应该能够将现有数据库与他们保存的数据一起使用,对吗? (如果现有数据库没有从上面的 1 中被覆盖)
如果架构发生变化,将数据从旧数据库传输到新数据库的最佳方式是什么?有人可以给我指南和示例代码吗?
最佳答案
仅替换应用程序包内的文件。如果数据库文件在您应用程序的文档目录中,则不会被替换。 (请注意,如果您更改应用程序包中的文件,代码签名将不再有效,应用程序将不会启动。因此除非您使用只读数据库,否则它必须位于 Documents 目录中。)
是。
什么是最好的取决于数据。您不会找到此类通用问题的示例代码。首先,您需要检测您的应用程序是否使用旧的数据库版本运行。然后你需要升级它。
检查版本:
- 您可以为新架构使用不同的文件名。如果 Version2.db 不存在但 Version1.db 存在,则进行升级。
- 您可以在您的数据库中嵌入一个架构版本。我有一个名为
metadata
的表,其中包含name
和value
列。我用它来存储一些通用值,包括dataversion
数字。我在打开数据库时检查那个数字,如果它低于当前版本,我会进行升级。 - 除了创建表,您还可以使用 sqlite 的内置 user_version pragma检查并存储版本号。
- 您可以直接检查表结构:查找列或表是否存在。
升级:
- 您可以使用一系列 SQL 命令就地升级。您甚至可以将 SQL 文件作为资源存储在您的应用程序包中,然后将其简单地传递给
sqlite3_exec
以完成所有工作。 (在事务中执行此操作,以防出现问题!) - 您可以通过将数据从一个数据库文件复制到一个新文件来升级。
如果您的升级可能会运行很长时间(超过一秒),您应该显示一个升级屏幕,向用户解释发生了什么。
关于iphone - iphone 应用程序更新期间的 sqlite DB 待办事项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4139876/