首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >核心数据:尝试删除时的“NSObjectInaccessibleException”。

核心数据:尝试删除时的“NSObjectInaccessibleException”。
EN

Stack Overflow用户
提问于 2013-10-11 22:03:54
回答 4查看 10.5K关注 0票数 8

核心数据允许我保存,但是当我试图删除对象时,我得到了以下错误:

*** 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>'

代码语言:javascript
复制
[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);
            }];
        }

日志:

代码语言:javascript
复制
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
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-10-11 23:31:41

当托管对象是不可访问的时,这意味着Core无法在持久存储文件中找到该对象。这种情况可能发生的原因有几个。

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

最有可能的情况是:您还会在其他地方删除这些对象,而这个删除会在执行fetch之后发生,但在代码崩溃之前发生。因此,当上面的代码试图删除它们时,它们已经消失了。看来,您使用的神秘核心数据方法是异步运行的(基于在到达崩溃点之前多次打印pd.planDateID的事实),因此可以在同一个线程上运行,也可以在另一个线程上运行。

所有这些假设您的日志语句实际上来自您发布的代码。这在一定程度上是有疑问的,因为日志中包含一条消息,上面写着“您更新了已接受的对象!”,这条消息在代码中没有出现。

票数 13
EN

Stack Overflow用户

发布于 2015-09-10 13:38:07

我同意汤姆·哈林顿关于根本问题的解释。此外,还很高兴知道,自从iOS 9以来,行为已经改变了。在NSObjectInaccessibleException 9上没有引发iOS,但会出现CoreData警告,如下所示:

代码语言:javascript
复制
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.

这不会导致崩溃,而是一个模棱两可的应用行为。

票数 10
EN

Stack Overflow用户

发布于 2015-07-25 14:38:27

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

另外,如果您在后台线程上使用对象,那么它应该是带有NSPrivateQueueConcurrencyType并发的智利上下文。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19327973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档