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

Ard*_*Dev 10 sqlite iphone

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

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

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

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

ben*_*ado 20

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

  2. 是.

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

要检查版本:

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

升级:

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

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

  • 关于版本检查的一些注意事项:您也可以使用内置的"user_version"编译指示(http://www.sqlite.org/pragma.html#pragma_schema_version),而不是使用模式版本的单独表. (2认同)