我对iOS开发很新,目前我的coredata处于损坏状态。在我的应用程序中,我有一个类型为A
的coredata对象,该对象保存对另一个B
类型的coredata对象的引用。
由于某些错误,有一些A
个对象指的是从coredata中删除的B
个对象。因此,当我尝试在A.B
对象上设置内容时,应用程序崩溃,因为它尝试从coredata和fault中加载B
。
所以我尝试在访问对象之前添加一个检查以查看该对象是否实际存在于coredata中,如果它不存在,我正在尝试创建一个新对象。
这是我检查对象是否存在的实现:
- (BOOL)hasObjectWithObjectID:(NSManagedObjectID *)objectID {
NSManagedObject *managedObject = nil;
if (objectID) {
NSError *error = nil;
managedObject = [self.managedObjectContext existingObjectWithID:objectID error:&error];
if (error) {
ERROR(@"Could not fetch persistent model with id : %@ , error : %@", objectID, error);
}
}
return managedObject != nil;
}
我希望这个方法只返回nil
,每当我尝试在coredata中不存在的引用上运行它时,我会收到以下错误:
error : Error Domain=NSCocoaErrorDomain Code=133000 "The operation
couldn’t be completed. (Cocoa error 133000.)".....
但根据文档existingObjectWithID
,当引用不存在时不会抛出任何错误
/* returns the object for the specified ID if it is already registered in the context, or faults the object into the context. It might perform I/O if the data is uncached. If the object cannot be fetched, or does not exist, or cannot be faulted, it returns nil. Unlike -objectWithID: it never returns a fault. */
我该如何处理这种情况?这是检查coredata中是否存在对象的正确方法吗?
UPDATE :我在访问指向B的A属性时希望获得nil
,但它会返回一个数据为Fault的对象,并在尝试实际设置某些对象时崩溃它的价值。
如果我打印A.B
,我会收到以下信息:
(entity: B; id: 0xd000000002380012 <x-coredata://2AC34EF0-A808-4460-86C1-86470F6767D6/B/p142> ; data: <fault>)
我确认coredata中没有B类型为id 142的对象。
奇怪的是,这只会在 iOS 8 上崩溃,在更高版本的iOS上使用相同的coredata,应用程序不会崩溃。