Cocoa 核心数据-ID为的现有ObjectWithError:导致错误133000
我的应用程序使用核心数据(借助神奇记录),并且使用Cocoa 核心数据-ID为的现有ObjectWithError:导致错误133000,cocoa,core-data,fault,Cocoa,Core Data,Fault,我的应用程序使用核心数据(借助神奇记录),并且使用NSOperation进行了大量多线程处理 当然,我非常小心地只在线程/操作之间传递NSManagedObjectID 现在,为了在操作中返回到相应的托管对象,我使用-existingObjectWithID:error:,因此: Collection *owner = (Collection *)[localContext existingObjectWithID:self.containerId error:&error]; 但我得
NSOperation
进行了大量多线程处理
当然,我非常小心地只在线程/操作之间传递NSManagedObjectID
现在,为了在操作中返回到相应的托管对象,我使用-existingObjectWithID:error:
,因此:
Collection *owner = (Collection *)[localContext existingObjectWithID:self.containerId error:&error];
但我得到的结果是零,error
说这是一个错误#13300:nsmanagedobjectreferentiationalegrityerror
以下是有关此错误的文档说明:
NSManagedObjectReferentialIntegrityError
Error code to denote an attempt to fire a fault pointing to an object that does not exist.
The store is accessible, but the object corresponding to the fault cannot be found.
这在我的例子中是不正确的:那个对象存在。事实上,如果我使用NSFetchRequest
遍历该集合的所有实例,我会在其中找到它,它的NSManagedObjectID
正是我传递给-existingObjectWithID:error:
的对象
此外,如果我使用-objectWithID:
,我会很好地得到一个正确的对象
所以我遗漏了一些东西。以下是一些额外的观察/问题:
- “不存在的对象”:在那句话中“存在”是什么意思?“存在”在哪里?在那个时候,它肯定“存在”在我的核心数据存储中
- “无法找到与故障对应的对象”:该句中“找到”的含义是什么?“发现”在哪里?它肯定会在我的核心数据存储中找到
所以我可能遗漏了一些关于现有objectwithid:error:
的功能?文件说:
If there is a managed object with the given ID already registered in the context, that object is returned directly; otherwise the corresponding object is faulted into the context.
[...]
Unlike objectWithID:, this method never returns a fault.
这无助于解决我的问题。我不介意让我的对象完全出错,而不是出错。事实上,当我访问对象属性时,其中的任何错误都会在下一个代码行触发
- 什么样的现实场景会导致出现
NSManagedObjectReferentiaIntegratyError
感谢您的启发。当您使用多个上下文时,您需要确保在将托管对象ID从上下文A传递到另一个上下文B之前保存上下文A。只有在保存完成后,才能从上下文B访问该对象
-objectWithID:
将始终返回非nil对象,但如果存储中没有备份对象,则一旦开始使用它,它将引发异常-existingObjectWithID:error:
将实际运行一些SQL并执行I/O,如果该对象尚未在其使用的上下文中注册
NSManagedObjectReferentiaIntegratyError=133000
NSManagedObjectReferentialIntegrityError错误代码,用于表示
尝试触发指向不存在的对象的错误。这个
存储区是可访问的,但与故障对应的对象无法访问
找到了。在Mac OS X v10.4及更高版本中提供。声明于
CoreDataErrors.h
看这个
可能对你有帮助
因此,可能的原因是您试图获取不存在的对象。这通常在尝试为不存在的对象创建objectid时发生。objectid将返回给您,当您尝试获取具有此objectid的对象时,会抛出此异常。问题在于您传递的NSManagedObjectID
是临时的。您可以通过调用NSManagedObjectID
的isTemporaryID
方法来检查它。从文档:
返回一个布尔值,该值指示
接收者是临时的
大多数对象ID返回编号。新对象插入到
托管对象上下文被分配一个临时ID,该ID将被替换
一旦对象被保存到持久存储中,就使用永久存储
您应该首先将更改保存到持久性存储,然后再获取一个永久ID以传递到其他上下文。我在处理NSManagedObjectContextDidSave通知时发现了这些更改。其他上下文已删除的许多对象无法获取,因为它们已被删除!然而,一些被删除的对象显示得很好,就像我在当前上下文中已经出错的对象一样
您可能会遇到类似的问题—迭代存储时可以找到的对象可能在被删除之前在该上下文中出现故障,您可能没有将更改合并回该上下文,或者还没有完全合并。我遇到了这个问题,尽管objectID不是临时的。
这是因为我愚蠢地忘了在孩子MOC上设置家长
childManagedObjectContext.parent=managedObjectContext
不是这样:当我使用-objectWithID:
时,我得到了正确的对象(正如我写的那样):我可以使用它,访问它的属性,它的关系,一切。事实上,它之前创建的环境被保存了下来。然而,-existingObjectWithID:error:
仍然失败,出现错误133000。听起来很奇怪。这两个上下文是否共享同一个NSPersistentStoreCoordinator?我通过在managedObjectContext上重置来“解决”这个问题。当然不是很理想,所以我期待听到其他的解决方案:-)你说的“在managedObjectContext上重置”是什么意思?你知道这一点吗?我遇到了同样的问题,我的对象肯定在那里,保存操作正在运行,但它只是偶尔发生。