应用程序崩溃是由于数据模型改变所致。

3

每当我更改数据模型时,我的应用程序就会崩溃。为了再次运行它,我应该从模拟器中删除应用程序,然后再运行它。除此之外,是否有任何方法可以在更改数据模型时不删除应用程序而运行应用程序。我希望使用以前的数据。提前致谢。


未解决的错误 错误域=NSCocoaErrorDomain Code=134130 "无法完成操作。(Cocoa error 134130。)" UserInfo=0x5f56690 {URL=/Users/vijaymunduru/Library/Application Support/iPhone Simulator/4.2/Applications/F553817C-C759-4885-A00A-544BE2A930E6/Documents/vijay.sqlite, metadata=<CFBasicHash 0x6a430d0 [0x18803e0]>{type = immutable dict, count = 7, this the crash report - Vijay
根据您的错误代码,在此处查看更多信息:https://dev59.com/aeo6XIcBkEYKwwoYTy8d - coneybeare
4个回答

4
答案有点棘手,但这对我总是有效的。这是针对新的兼容性 .sqlite 文件的 干净 安装,不是迁移
启动模拟器,删除应用程序和数据(在删除应用程序之后会弹出一个窗口)。
退出模拟器。
打开 X-Code,在对数据模型进行任何编辑后,如果需要更新数据模型版本:
  1. 编辑器 > 添加模型版本...
  2. 在弹出的对话框中设置您的首选项(最好递增)
  3. 单击 {appname} .xcdatamodeld,然后在最右侧的窗格中
  4. 单击最右侧列顶部的 3 个图标中的左侧图标
  5. 有版本的 Core Data 模型 下选择刚创建的模型
删除 {*appname*}.sqlite 文件(或备份它、从项目文件夹中删除它并删除引用)。
清理应用程序 (产品 > 清理)。
在模拟器中运行应用程序 (本教程假定为 4.2)。
在模拟器运行时,在 Finder 窗口中导航到: {*home*} > 应用程序支持 > iPhone 模拟器 > 4.2 > 应用程序 > {*随机标识符*} > 文档 > {*appname*}.sqlite 复制 这个文件到另一个位置。
停止在 X-Code 中运行应用程序。
将 {appname} .sqlite 文件拖放到 X-Code 的文件列表中。
在弹出的对话框中,确保选中了 复制到文件夹 复选框。 产品 > 清理
然后再次在模拟器中运行应用程序
现在您应该有一个工作正常的 sqlite 文件!
祝好, 罗伯特

3

我使用了轻量级迁移,但仍然崩溃了。有什么想法吗? - Vijay
未解决的错误 错误域=NSCocoaErrorDomain 代码=134130 "操作无法完成。(Cocoa error 134130。)" UserInfo=0x5f56690 {URL=/Users/vijaymunduru/Library/Application Support/iPhone Simulator/4.2/Applications/F553817C-C759-4885-A00A-544BE2A930E6/Documents/vijay.sqlite, metadata=<CFBasicHash 0x6a430d0 [0x18803e0]>{type = immutable dict, count = 7},这是我遇到的错误,请在这方面帮助我。 - Vijay
我认为你应该按照 @pokstad 的建议去做。 - Chaitanya Gupta
链接无法使用 - “抱歉,该页面无法找到” - Aviram Netanel

1

NSPersistentStore所使用的文件一次只能对应一个数据模型版本。您需要将数据迁移到新版本或告诉应用程序每次启动时删除持久存储文件(仅限开发目的)。

刚看到您想保留旧数据。您可以尝试将数据序列化为NSDictionary,然后保存到plist / json / xml文件中。然后,当程序启动时,您可以删除旧的NSPersistantStore文件并创建一个新的文件。将数据从plist / json / xml文件导入到新的空持久存储文件中。

请记住,为了使轻量级迁移起作用,您需要保留数据模型的先前版本以及新版本。Core Data需要知道过去和现在的两个模型才能执行迁移。


是的。我正在使用轻量级迁移,但仍然无法阻止应用程序崩溃。您能否详细说明我们在更改数据模型时应该遵循的过程? - Vijay
尝试手动迁移。您可以将数据序列化并保存到 plist 文件中,然后重新导入它。这可能需要大量工作,具体取决于数据模型的大小,但对于无法使用轻量级迁移的数据模型的大更改非常有用。 - pokstad
未解决的错误 错误域=NSCocoaErrorDomain 代码=134130 "操作无法完成。(Cocoa错误134130。)" UserInfo=0x5f56690 {URL=/Users/vijaymunduru/Library/Application Support/iPhone Simulator/4.2/Applications/F553817C-C759-4885-A00A-544BE2A930E6/Documents/vijay.sqlite, metadata=<CFBasicHash 0x6a430d0 [0x18803e0]>{type = immutable dict, count = 7} 这是我遇到的错误。你能帮我解决吗? - Vijay
这个人遇到了同样的错误:https://dev59.com/aHI-5IYBdhLWcg3wfoW1 - pokstad
我使用了轻量级迁移。每当我向实体添加一个字段时,应用程序不会崩溃。但是当我删除一个字段时,应用程序就会崩溃。 - Vijay
你是在创建数据模型的新版本而不是替换旧版本吗?每次更改后都应该有数据模型的新版本。请参考我上面发布的链接。 - pokstad

0

我有同样的问题,但我还没有解决它。目前我并不关心这个问题。在我的应用程序开发过程中,每次更改模型时,我只需清除数据即可。

我认为,要使用轻量级迁移,您仍然需要为要从或要迁移到的每个数据模型版本制作副本。虽然它是轻量级的,但当您在早期开发阶段频繁更改数据模型时,它并不够轻量级。

我建议您捕获它无法加载数据时抛出的异常,并让您的程序在这种情况下自动删除数据并重新创建初始状态。这与忽略问题的答案相同,但您不必每次手动删除数据。您可能应该在生产中保留该代码,以备迁移由于某些原因无法工作时作为备份,但也许您应该询问用户是否要删除数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接