0

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

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

所以在 managedObjectContext 中有一个未填充的 NOT Optional 属性的 managedObject。用户继续填写更多数据,然后关闭应用程序,认为数据已保存。几个小时后,或者当他们从扩展坞中终止应用程序并重新打开应用程序时,在电话/消息之后输入的所有数据都将消失,并出现以下错误:

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

如何防止此错误发生?我可以想到2个解决方案:

1) 将所有属性设为可选,但我将不得不更改核心数据模型并进行数据迁移。我从来没有这样做过,并且担心迁移在上线时会失败。所有应用内购买都存储在核心数据中。

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

3) ?

谢谢,

4

3 回答 3

2

您实际上可以捕获并显示发生在 Core Data 中的验证错误。这是如何完成的示例:https ://stackoverflow.com/a/3510918/171933

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

于 2013-10-18T21:05:37.667 回答
1

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

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

无论如何,将属性从强制更改为可选不需要数据迁移。不是每一个变化都如此。但这不是最好的解决方案。

于 2013-10-18T20:34:06.577 回答
0

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

于 2013-10-18T21:24:38.427 回答