核心数据上下文合并后如何获取对象

时间:2010-06-05 13:48:51

标签: iphone cocoa core-data

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

我写的代码就像这样:

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

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

所以我尝试传递objectIds来获取主线程中的NSManagedObject实例,这些实例是在另一个线程中生成的。起初我尝试了“objectWithId”方法,但它生成了故障对象。然后我尝试了“existingObjectWithID”方法,但它部分生成了对象,其他的则为nil,后面跟着Error:

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

有什么问题?有没有办法在另一个线程中合并后如何通过objectIds检索所有对象?

谢谢。

3 个答案:

答案 0 :(得分:7)

有两种类型的对象ID。在保存NSManagedObject之前,它具有临时对象ID。保存后,它是固定的。所以你可能会使用错误的ID ...

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

答案 1 :(得分:2)

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

developer documentation on error 133000

  

NSManagedObjectReferentialIntegrityError = 133000

     

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

答案 2 :(得分:0)

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

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

这将为您提供更多信息。

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