0

我有一个基于NSInMemoryStoreType商店的核心数据堆栈。而且我注意到删除对象并没有真正删除它们或使它们为零,而是只是将它们变成故障。

例如,(MyManagedObjectEntityClass 以及 <> 标识符是占位符)

    MyManagedObjectEntityClass *o = [NSEntityDescription insertNewObjectForEntityForName:@"<MyManagedObjectEntityClass Entity Name>" inManagedObjectContext:self.localContext];
    NSLog(@"\n%@", o);
    [self.localContext deleteObject:o];
    NSLog(@"\n%@", o);

将记录该对象仍然存在,只是它的数据是错误的。

在删除之后添加 [self.localContext save:nil];也不会改变这一点。

我希望我可以在某个时候测试o变量nil,在这种情况下我会重新加载对象 - 但似乎我不能。

以防万一,是的,我知道我可以改为测试o. -isFault但问题是,将此测试外推到 NSSet,我不能仅仅依靠[[set anyObject] isFault]得出该集合中的所有对象都已被删除的结论(理想情况下,该集合的计数为 0,但所有对象仍作为故障存在)。

因此,我想知道是否有可能,或者我可以采取什么替代方法来测试对象是否已被删除,并且对它们是托管对象这一事实是透明的。

4

1 回答 1

1

这实际上不是核心数据问题。C(以及扩展的 Objective-C)不是那样工作的。

deleteObject:方法接受一个参数,一个指向对象的指针。它可以改变对象(比如设置它的isDeleted标志),或者它可以做与对象相关的其他事情(比如从它的托管对象上下文中删除它)。它不能改变指针本身的值。所以无论它做什么或应该做什么,C 说一旦它完成,你传入的指针仍然指向内存中的相同位置。因此,该方法实际上不可能在这种语言中强制该指针为零。如果你想让它为零,你必须自己改变它。(顺便说一句,实现该方法以获取指向指针参数的指针是可能的,这可以修改你的指针。但是,这对其他引用(例如数组中的引用)没有影响,因此毫无意义)。

这就是该isDeleted方法是公共的原因,因此如果您在其他位置有指向该对象的指针,您可以在尝试使用它之前检查它是否已被删除。

如果这还不够方便(而且通常不是),Core Data 还提供NSManagedObjectContextObjectsDidChangeNotificationNSManagedObjectContextDidSaveNotification. 您可以在应用程序中的任何位置使用它们来获取上下文更改的通知,并以适当的方式响应(例如更新数组)。这些通知都试图通过提供插入、更新和删除对象的列表来帮助您。尽可能使用这些来检查您是否确实需要更新您的参考资料。

于 2013-05-09T16:35:06.410 回答