CoreData Context合并后如何获取对象

Posted

技术标签:

【中文标题】CoreData Context合并后如何获取对象【英文标题】:How to get objects after CoreData Context merged 【发布时间】:2010-06-05 13:48:51 【问题描述】:

我尝试保存数据并与 CoreData 和 iPhone 应用程序的多线程合并。 但是合并后我无法在主线程中获取托管对象。

我是这样写代码的:

[managedObjectContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
                                       withObject:notification
                                    waitUntilDone:YES];

[self performSelectorOnMainThread:@selector(didMerged:) withObject:objectIds waitUntilDone:YES];

所以我尝试通过 objectIds 来获取主线程中的 NSManagedObject 实例,这些实例是在另一个线程中生成的。起初我尝试了“objectWithId”方法,但它生成了错误对象。然后我尝试了“existingObjectWithID”方法,但它部分生成了对象,其他对象为零,并出现以下错误:

[Error] Error Domain=NSCocoaErrorDomain Code=133000 "Operation could not be completed. (Cocoa error 133000.)"

怎么了?在另一个线程中合并后,有什么办法可以通过objectIds检索所有对象?

谢谢。

【问题讨论】:

【参考方案1】:

有两种类型的对象 ID。在保存 NSManagedObject 之前,它具有临时对象 ID。保存后就解决了。所以你可能使用了错误的 id...

在此处阅读托管对象 ID 和 URI:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdUsingMOs.html

【讨论】:

【参考方案2】:

您的上下文合并似乎失败了。

developer documentation on error 133000

NSManagedObjectReferentialIntegrityError = 133000

NSManagedObjectReferentialIntegrityError 错误代码表示尝试触发指向不存在的对象的故障。 存储可访问,但找不到故障对应的对象。 适用于 Mac OS X v10.4 及更高版本。 在 CoreDataErrors.h 中声明。

【讨论】:

感谢您的快速回复。嗯...在另一个线程中,我可以保存数据而不会出现任何错误。如何在没有#133000错误的情况下将它们合并到主线程中的上下文中?【参考方案3】:

首先,您需要展开错误。将输出更改为:

NSLog(@"Error: %@\n%@", [error localizedDescription], [error userInfo]);

这将为您提供更多信息。

其次,如果您在多个线程中使用单个上下文,那么您做错了。您需要查看有关核心数据和线程的文档。基本规则是:每个线程一个上下文;时期。如果您需要跨多个线程管理数据,请查看主线程上后台线程的保存通知。我建议查看我在 Mac 开发者网络上的文章以获取相关示例。

【讨论】:

谢谢。我会详细检查错误。是的,我为每个线程创建了上下文。

以上是关于CoreData Context合并后如何获取对象的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 合并冲突显示托管对象版本更改而不是数据

RestKit / CoreData:两次请求相同的URL时插入重复的对象而不是合并

合并到父/主上下文后,子上下文对象变为空

如何在后台使用 CoreData 获取数据?

如何跨视图传递 CoreData 对象

如何从 CoreData 获取完整的对象(不是故障)?