删除托管对象后的核心数据错误

时间:2016-07-10 08:15:48

标签: ios objective-c core-data ios9

基本上,我在尝试从NSManagedObjectContext删除它并保存上下文后访问某些属性。问题是,在保存上下文后,Core Data将对象数据标记为错误,显然无法恢复。

我创建了一个示例项目以便复制该问题,您可以下载它here。为了说明,以下代码段为:

City *city = [self.cities objectAtIndex:indexPath.row];
[self.managedObjectContext deleteObject:city];
if (![self.managedObjectContext save:&error]) {
    [self.managedObjectContext rollback];
    NSLog(@"Error: %@", error);
}else{
    NSLog(@"%@", city);
    // All properties of "city" are zeroed.
    // Saved. Update data sources and animate changes...
}

产生

<City: 0x7fe1cbd3cba0> (entity: City; id: 0xd000000000040004 <x-coredata://C1E3D3D8-188D-41DE-B701-08AF6D3E8860/City/p1> ; data: {
    country = "0xd000000000080002 <x-coredata://C1E3D3D8-188D-41DE-B701-08AF6D3E8860/Country/p2>";
    name = Rosario;
})

<City: 0x7fe1cbd3cba0> (entity: City; id: 0xd000000000040004 <x-coredata://C1E3D3D8-188D-41DE-B701-08AF6D3E8860/City/p1> ; data: <fault>)

在删除托管对象之后,我想要访问托管对象的原因是更新NSMutableArray,它充当表视图的数据源,并更新导航控制器中先前控制器中的另一个数据源stack(示例项目中未实现)。

总结一下,我的问题是:

NSManagedObject删除NSManagedObjectContext并保存上下文后,不再保证托管对象中的数据可以访问?即使保留了对该托管对象的引用?

基于我所研究的内容,Core Data正在摆脱实体数据,以便在保存上下文后节省内存。这个假设是否正确?还有其他因素可能导致此数据错误吗?

感谢。

1 个答案:

答案 0 :(得分:1)

始终动态呈现NSManagedObject。因此,如果将其删除,Core Data会将数据排除在外。它不再存在。您真正的问题是如何从各种数组中删除对象?首先,您应该在使用您希望的任何搜索技术删除对象之前将其删除。这是最简单,最稳健的途径。其次,对象指针本身仍然有效,可以与-removeObject:调用一起使用。请允许我强调,这是一个脆弱的解决方案。我强烈建议您在删除对象之前将其删除。

回答你的第二个问题,

  

是否还有其他因素导致此数据错误?

没有。删除对象会导致错误。如果数据迄今为止可用,那是因为它是一种实现特性。写入实现而不是规范,尤其是数据库技术,充满了各种各样的生命周期问题。引用聪明的博士,不要这样做。&#34;