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