核心数据:尝试删除时出现“NSObjectInaccessibleException”。

核心数据允许我保存,但是当我尝试删除对象时,出现以下错误:

*** Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault for '0xa6b7e00 <x-coredata://8A687ECB-03F8-47C0-8470-087B9CF032B1-2801-00000A8C9A09CDB7/Notification/p2774005D-4B49-4378-A109-949F15D37032>' '

 [self.managedObjectContext executeFetchRequest:allFetchRequest onSuccess:^(NSArray *results) { NSLog(@"Fetch for Objects with origial_id"); if (results.count>0) { NSLog(@"original_id = %@", dlPlanDate.original_id); NSLog(@"Results Recieved %i", results.count); for (PlanDate *pd in results) { PlanDateResolved *pdResolved = [NSEntityDescription insertNewObjectForEntityForName:@"PlanDateResolved" inManagedObjectContext:self.managedObjectContext]; NSArray *keys = [[[pd entity] attributesByName] allKeys]; NSDictionary *dict= [pd dictionaryWithValuesForKeys:keys]; [pdResolved setValuesForKeysWithDictionary:dict]; [pdResolved setValue:[pd plandate_id] forKey:[pdResolved primaryKeyField]]; pdResolved.senderUser = pd.senderUser; pdResolved.objectCreator = pd.objectCreator; pdResolved.users = pd.users; NSLog(@"pd.planDateID %@", pd.plandate_id); [self.managedObjectContext saveOnSuccess:^{ NSLog(@"Saving Each Object in the Array to PlanDateResolved with Original ID"); [self.managedObjectContext deleteObject:pd]; [self.managedObjectContext saveOnSuccess:^{ NSLog(@"Deleted the pd Object object!"); } onFailure:^(NSError *error) { NSLog(@"There was an error Deleting pd Object %@", error); }]; } onFailure:^(NSError *error) { }]; } } } onFailure:^(NSError *error) { NSLog(@"Error fetching: %@", error); }]; } 

日志:

 2013-10-11 11:53:11.175 ST[2801:c07] Fetch for Objects with origial_id 2013-10-11 11:53:11.175 ST[2801:c07] original_id = CFADD5A7-C9E8-48B3-91B2-56FDBC0F9BAB 2013-10-11 11:53:11.175 ST[2801:c07] Results Recieved 3 2013-10-11 11:53:11.180 ST[2801:c07] pd.planDateID CFADD5A7-C9E8-48B3-91B2-56FDBC0F9BAB 2013-10-11 11:53:11.182 ST[2801:c07] pd.planDateID 5917071A-8CFD-4C7C-A60F-A76FA4814429 2013-10-11 11:53:11.183 ST[2801:c07] pd.planDateID 1998BB90-D6FC-4226-977C-3414C4A57078 2013-10-11 11:53:11.913 ST[2801:c07] You updated the Accepted object! 2013-10-11 11:53:11.913 ST[2801:c07] Saving Each Object in the Array to PlanDateResolved with Original ID 2013-10-11 11:53:11.913 ST[2801:c07] Saving Each Object in the Array to PlanDateResolved with Original ID 2013-10-11 11:53:12.155 ST[2801:c07] Saving Each Object in the Array to PlanDateResolved with Original ID 2013-10-11 11:53:35.482 ST[2801:c07] *** Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault for '0xa6b7e00 <x-coredata://8A687ECB-03F8-47C0-8470-087B9CF032B1-2801-00000A8C9A09CDB7/Notification/p2774005D-4B49-4378-A109-949F15D37032>'' *** First throw call stack: (0x24e7012 0x1cfae7e 0x1a20a48 0x1a515e8 0x1ac2879 0x1a59627 0x1a59271 0x1ace025 0x1a53cc1 0x1e7f014 0x1e6ed5f 0x1e6eaa3 0x1a53c8b 0x1a53aee 0x1a30eac 0x1ab0c1 0x1a5398f 0x1e7f014 0x1e6f7d5 0x248daf5 0x248cf44 0x248ce1b 0x24027e3 0x2402668 0x92effc 0x418d 0x25c5) libc++abi.dylib: terminate called throwing an exception 

当pipe理对象不可访问时,这意味着Core Data无法在持久性存储文件中find该对象。 有几个原因可能发生。

我不知道executeFetchRequest:onSuccess:saveOnSuccess:来自哪里,但是假设他们做了他们的方法名称暗示的(而且没有可怕的错误), 上面的代码中没有明显的原因会出现这种情况。 所以这是作为你在其他地方工作的副作用而发生的。

最有可能的是:你也在别的地方删除这些对象,这个删除在你执行提取之后,但在代码崩溃之前就会发生。 因此,当上面的代码尝试删除它们时,它们已经不存在了。 看起来 ,你使用的神秘的核心数据方法asynchronous运行(基于事实,你得到pd.planDateID打印到达崩溃点之前),所以这可能是在同一个线程或不同的线程。

[所有这些假定您的日志语句实际上来自您发布的代码。 这有点怀疑,因为日志中包含一条消息: “您更新了Accepted对象!” ,没有出现在代码中。]

我同意Tom Harrington关于根本问题的解释。 此外,从iOS 9开始,这种行为已经发生了变化,这也是很好的一个例子。 在iOS 9上没有引发NSObjectInaccessibleException,但会发生CoreData警告,如下所示:

 CoreData: warning: An NSManagedObjectContext delegate overrode fault handling behavior to silently delete the object with ID '0xd0000000025c0006 <x-coredata://336D9F02-727B-42C5-AEDD-8007D4AB521D/Film/p151>' and substitute nil/0 for all property values instead of throwing. 2015-09-10 15:27:09.799 PROJECTX[2141:818058] CoreData: error: Mutating a managed object 0xd0000000025c0006 <x-coredata://336D9F02-727B-42C5-AEDD- 8007D4AB521D/Bla/p151> (0x12812bea0) after it has been removed from its context. 

这不会导致崩溃,而是一个模糊的应用程序行为。

看看你的错误的时间戳。 显然,你已经尝试在其他地方访问被删除的托pipe对象,稍后。 汤姆和雷伊的解释是正确的。 该对象不可访问,因为它不存在于持久存储中。

你应该检查你的代码,你仍然可能有pipe理对象的引用,并确保你没有试图访问它,一旦它被删除。

这通常会发生,如果您尝试访问错误的NSManagedObjectContext中的NSManagedObject。 如果从UI线程使用托pipe对象(直接显示数据或在主线程上操作),则需要使用NSMainQueueConcurrencyType并发性。

另外,如果您在后台线程上使用对象,则应该是具有NSPrivateQueueConcurrencyType并发性的智能上下文。