ios - 删除托管对象后的核心数据故障

标签 ios objective-c core-data ios9

基本上,我试图在从 NSManagedObjectContext 中删除 a 并保存上下文后访问 a 的某些属性。问题是,在保存上下文之后,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 作为 TableView 的数据源,并更新之前 Controller 中的另一个数据源导航 Controller 堆栈(示例项目中未实现)。

总结一下,我的问题是:

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

根据我的研究,一旦保存了上下文,Core Data 就会摆脱实体数据以节省内存。这个假设是否正确?是否还有其他因素可能导致此数据错误?

谢谢。

最佳答案

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

在回答你的第二个问题时,

Are there other factors that might be causing this data faulting?

没有。删除对象导致错误。如果数据在此之前可用,那是因为它是一个实现特征。编写实现而不是规范,尤其是数据库技术,充满了各种生命周期问题。引用明智的医生的话,“不要那样做。”

关于ios - 删除托管对象后的核心数据故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38289973/

相关文章:

ios - 核心数据 + swift Int = 崩溃

ios - 以编程方式在 UISplitViewController 中显示主视图上的幻灯片

objective-c - 如何替换字符串中的部分字符串?

ios - 在 UICollectionView swift 中折叠一个部分的单元格

ios - 苹果 LLVM 6.1 错误 Xcode

ios - Objective-C iOS 开发在设置变量时使用 viewDidLoad 或 initWithCoder,为什么?

ios - 当 App 退出并重新启动时,NSManagedObjectContext 不会保存

ios - 如何在OS X应用程序中重置内容和设置?

ios - iPhone 5s 属于哪个尺寸等级,iPhone 6 属于哪个尺寸等级?

ios - Cordova 3.3。适用于 iOS 的 Facebook 集成