【问题标题】:Approach to deal with Core Data save error (Cocoa error 1570.)处理 Core Data 保存错误的方法(Cocoa 错误 1570。)
【发布时间】:2013-10-27 19:27:19
【问题描述】:

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

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

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

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

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

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

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

3) ?

谢谢,

【问题讨论】:

    标签: ios objective-c xcode core-data


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我不确定我是否理解处置未保存对象的问题。您创建了它,用户正在编辑它,大概您正在将用户输入中的值分配给该对象。你怎么还没有在某处引用它?
      • 我的错,是想太多了。我通过在创建后立即将潜在的未保存对象分配给 AppDelegate 属性来使其工作,并在保存核心数据之前检查它是否缺少任何必需的属性。效果很好 将实体的属性更改为可选会破坏我现有的核心数据模型,我猜它确实需要数据迁移。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-03
        • 1970-01-01
        • 2010-09-22
        • 2011-01-16
        • 1970-01-01
        • 2018-03-07
        • 1970-01-01
        相关资源
        最近更新 更多