【问题标题】:iPhone Core Data - cannot fulfill a fault erroriPhone Core Data - 无法完成故障错误
【发布时间】:2011-09-29 16:47:47
【问题描述】:

我有A、B、C三个班。A是主班。

当用户想要查看已购买的所有对象的列表时,从 A 调用 B 类并在核心数据实体中显示对象列表。

在 B 类中,用户可以购买新物品(应用内购买)。当用户想要购买另一个对象时,调用 C 类。

当类 C 被调用时,在核心数据实体上使用创建一个新对象

anObject = [NSEntityDescription insertNewObjectForEntityForName:@"Objects" inManagedObjectContext:context];

这个对象然后被分配给 C 类的一个本地引用,使用类似的东西

self.object = anObject;

这个对象变量是这样声明的:

.h
MyObjects *object;
@property (nonatomic, retain) MyObjects *object;

and @synthesized on .m

MyObjects 是代表实体的核心数据类。

理论上,object 会保留分配给它的任何东西,所以我之前输入的 self.object = anObject 行将保留 self.object 上的 anObject 引用,对吧?

问题是,当我在购买新对象后尝试访问同一个类中的 self.object 时,收到错误“CoreData could not fulfill a fault for XXX”,其中 XXX 正是 self.object。

在代码中没有从数据库中删除任何对象。我能识别的对数据库的唯一操作是崩溃前另一个班级完成的保存操作。保存是由类似的东西完成的

if (![self.managedObjectContext save:&error]) ...

有什么关系吗?可能是什么原因造成的?

【问题讨论】:

    标签: iphone core-data


    【解决方案1】:

    CoreData 管理托管对象的生命周期,您不应保留和释放它们。如果您想保留对对象的引用以便以后可以检索它,那么您必须存储对象的 id(使用 -[NSManagedObject objectID] 获得)。然后使用它稍后使用 -[NSManagedObjectContext objectWithID:] 检索对象。

    确保您了解 CoreData 故障。阅读documentation

    【讨论】:

    • 好的。现在我按你说的做。我在创建对象时保存了 objectID 引用,然后使用 objectWithID 检索它,但它仍然在同一行崩溃,也就是说,在我检索对象并尝试设置其属性后恰好一行。
    • 当您存储 id 并稍后检索对象时,我们需要查看代码。
    • 问题是这样的:如果我打印到控制台使用 objectWithID 检索它后得到的对象是这样的: (entity: Objects; id: 0x1b6ca0 ; data: ) 我认为这是一个错误。现在的问题是我如何“无误”...
    • 你不需要做任何事情。只需访问它的任何属性,CoreData 就会为您处理它。请阅读并理解有关故障的文档。
    • 什么?现在什么工作?错误说无法完成故障错误。
    【解决方案2】:

    几天前我遇到了类似的问题(使用 NSFetchedResultsController),我将 fetchedObjects 放入一个数组并收集属性以从数组对象填充表。似乎如果数组中的对象出现故障,除非您对直接对象进行操作,否则您无法对其进行故障排除。就我而言,我通过获取有问题的代码行并调用[[_fetchedResultsController objectAtIndexPath:indexPath] someAttribute] 解决了这个问题。我认为做类似的事情也可以解决您的问题。需要从 managedObjectContext 获取错误值似乎有点乏味,但这是我个人可以解决问题的唯一方法。

    【讨论】:

    • 谢谢。你能翻译那个吗? “数组中的对象出现故障”是什么意思,为什么会发生这种情况?你的意思是我的 self.object 可以指向一个无效的对象,即使它被保留并且没有完成删除它的操作?我无法理解。谢谢。
    • 很抱歉给您带来了困惑。为了节省内存,Core Data 属性和关系在不使用时经常出错。简而言之,属性被压缩。您得到的错误并不是说您的 Core Data 对象已经消失(它仍然存在于您的数据库中),只是它无法读取有关它的特定信息,因为它无法对属性进行故障排除,这是 Core Data 必须做的. This faulting guide 给出了一个很好的例子,当数据出现故障时意味着什么
    • 那么,如何再次访问该对象?我已经按照 Robin 的建议完成了,也就是说,我正在存储对象的 objectID,然后,当我想检索对象时,我使用 objectWithID 获取它,但我得到的对象再次出现故障。
    • 抱歉,回复了这么久,但看起来您的工作正常。所以我很高兴看到=]
    【解决方案3】:

    Core Data 负责管理内存中托管对象的生命周期。了解托管对象上下文非常重要 - 阅读documentation

    Apple 还提供完整的故障排除部分here,其中包含导致错误的原因等内容。但只有了解核心数据的工作原理,它才会真正有用。

    【讨论】:

      【解决方案4】:

      最可能的错误是您保存的对象不属于托管对象上下文。

      假设你在不同的线程上使用同一个对象,而那些不同的线程使用不同的托管对象上下文,那么就会发生这种情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-07
        • 1970-01-01
        • 2011-08-01
        • 1970-01-01
        • 2014-12-04
        • 1970-01-01
        相关资源
        最近更新 更多