从内存存储中删除Core Data对象会将其转换为错误但不会删除它们

时间:2013-05-08 23:59:50

标签: ios cocoa core-data

我有一个基于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的{​​{1}}变量,在这种情况下我会重新加载对象 - 但似乎我不能。

以防万一,是的,我知道我可以为nil测试o。但问题是,将此测试推断为NSSet并且我不能仅仅依靠-isFault来推断该集合中的所有对象都已被删除(理想情况下,集合的计数将为0,但所有对象仍然存在故障)。

所以我想知道它是否可能或者我可以采用什么替代方法来测试对象是否已被删除,其方式是透明的,因为它们是托管对象。

1 个答案:

答案 0 :(得分:1)

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

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

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

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