处理Core Data保存错误的方法(Cocoa error 1570.)

时间:2013-10-18 20:18:19

标签: ios objective-c xcode core-data

我的应用在我的核心数据模型中的某些实体中有一些属性(关系)不是可选的。我在App Delegate的applicationDidEnterBackground上有save方法。这就是问题所在。

我的一些用户不断丢失数据(保存错误),因为当他们输入数据但尚未填写实体的非可选属性时,会发出电话或推送消息。他们拿起电话或阅读消息,回到应用程序并继续输入数据。但是,我的应用程序具有每次应用程序启动时都需要的密码锁定,并将用户带到仪表板控制器,以便他们无法在电话呼叫/消息之前恢复数据输入。

因此在managedObjectContext中有一个具有未填充的NOT Optional属性的managedObject。用户继续填写更多数据,然后关闭应用程序,认为数据已保存。几个小时后或当他们从Dock停止应用程序并重新打开应用程序时,在电话呼叫/消息之后输入的所有数据都会消失,并显示以下错误:

NSLocalizedDescription = "The operation couldn\U2019t be completed. (Cocoa error 1570.)";
NSValidationErrorKey = propertyName;

如何防止此错误发生?我能想到两个解决方案:

1)使所有属性都可选,但我必须更改核心数据模型并进行数据迁移。我从来没有这样做,如果迁移失败,我担心它会上线。所有应用内购买都存储在核心数据中。

2)以某种方式从上下文中检查带有未填充的NOT可选属性的错误managedObject,并在保存之前删除该对象。我该怎么做?

3)?

谢谢,

3 个答案:

答案 0 :(得分:2)

您实际上可以捕获并显示出现的核心数据验证错误。以下是如何完成此操作的示例:https://stackoverflow.com/a/3510918/171933

这样您就可以在用户保存之前验证数据(可能在他们输入数据时)并向他们显示相应的消息。

答案 1 :(得分:1)

由于您的应用不会让人们从中断的地方继续,因此您可以在加载密码视图时处理新的未保存对象。您必须引用他们正在编辑的对象 - 所以删除它,然后继续。只需使用托管对象上下文的deleteObject:方法。

如果您可以在返回应用程序时恢复之前的状态,那将会更好。使您的密码视图覆盖编辑视图,而不是回到应用程序的初始视图。然后在用户输入代码后隐藏密码视图,用户继续他们所在的位置。

对于它的价值,将属性从强制更改为可选不应该要求数据迁移。不是每个改变都有。但那不是最好的解决方案。

答案 2 :(得分:0)

实际上,用户负责填充的CoreData对象上的任何值都应该为nil。您的业​​务逻辑应该强制执行您的规则,而不是CoreData。只需要填充密钥或标识符等内容即可保存。