我正在更新一个使用 sqlite 数据库的旧 iOS 应用程序。我更改了数据库结构,将列添加到现有表中。现在,我正在我的设备上对其进行测试。如果我从 iPad 上清除我的旧应用程序,然后在其上运行这个新的更新版本,它工作正常。但是如果我已经在 ipad 上安装了旧版本并测试了这个更新版本,它会以某种方式使用旧数据库而不是更新的数据库。有人可以帮我为什么这样做吗?
3 回答
我的猜测并尝试为您做一个简单的答案是这样的。您可能更新了项目文件中的数据库 - 这意味着当您运行它时,您的新数据库将存在于包中。捆绑包中的文件无法更新,因此通常的做法是将数据库从捆绑包中复制出来并将其存储在 ios 沙箱中的某个位置。我通常使用文档目录来保持简单。
最有可能发生的情况是,当您在以前的安装中运行它时,它会看到该文件已经复制到设备上,因此它不会触及它,但是在新安装时,它可能会看到数据库丢失,因此它会复制它在那里,这就是为什么在新安装上它工作正常但现有安装却不行的原因。
在应用程序委托或您的根视图控制器中查找检查现有数据库并在启动时根据需要复制数据库的代码。
如果您需要更新现有安装的数据库,则需要强制进行复制。
但请注意,如果您在现有数据库中有数据,如果它很重要,请不要覆盖它。如果重要数据存储在那里,您必须做一个小游戏来获取数据并导入新数据库,或者更简单的方法是在现有数据库上运行数据库模式修改命令,所以它是相同的.
同样,请注意并在运行这些命令之前复制本地数据库文件,以防万一。
祝你好运
在 iOS 中,SQLLite 数据库实际上只是一个文件。当您使用旧应用程序时,它会在数据库文件中创建架构。当您加载新应用程序时,数据保持不变。如果要使用新模式,则必须检测旧模式并更新现有数据。我相信有记录的方法来处理这个问题。Bryanmac 的问题参考似乎是一个很好的起点。
当您安装应用程序的新版本时,iOS 实际上会将其安装在一个新目录中,然后将文档文件夹的内容从旧版本复制到新版本中的文件夹。如果您只想使用您的新数据库,最好的方法是重命名此数据库或将其存储在应用程序文档存储中的不同目录中。
这是有关在 iOS 上更新 An sqlite CoreData 后备存储的相关文章:http: //www.musicalgeometry.com/? p=1736