我正在回答关于这个问题的自己的问题。在我看到尽可能多的其他答案之前,我不会接受它。
在过去的几天里,我一直在努力使用以下代码
- (id)fetchUniqueEntity:(Class)entityClass
withValue:(id)value
fromContext:(NSManagedObjectContext *)context
insertIfNil:(BOOL)insertIfNil {
if(!value) {
return nil;
}
NSString *entityUniqueIdentifierKey = [entityClass performSelector:@selector(uniqueIdentifierKey)];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", entityUniqueIdentifierKey, value];
NSArray *entities = [self fetchEntities:entityClass
withPredicate:predicate
fromContext:context];
if(!entities || [entities count] == 0) {
if (insertIfNil) {
return [entityClass performSelector:@selector(insertInManagedObjectContext:)
withObject:context];
}
} else {
return [entities objectAtIndex:0];
}
return nil;
}
- (NSArray *)fetchEntities:(Class)entityClass
withPredicate:(NSPredicate *)predicate
fromContext:(NSManagedObjectContext *)context {
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSString *entityName = [entityClass performSelector:@selector(entityName)];
[request setEntity:[NSEntityDescription entityForName:entityName
inManagedObjectContext:context]];
if(predicate) {
[request setPredicate:predicate];
}
NSError *error;
NSArray *entities = [context executeFetchRequest:request
error:&error];
if(error) {
NSLog(@"Error executing fetch request for %@! \n\n%@", entityName, error);
}
return entities;
}
顶级帮助程序方法旨在在大型下载过程中帮助建立关系。我遇到的问题是,即使说持久存储中存在一个
Account
为accountId
的1
对象(已确认),也只能在一半时间内检索该对象。老实说,我不能解释为什么。有任何想法吗? 最佳答案
经过大量的调试和反复试验后,我发现将谓词格式从
[NSPredicate predicateWithFormat:@"%K == %@", entityUniqueIdentifierKey, value];
至
[NSPredicate predicateWithFormat:@"%K == %d", entityUniqueIdentifierKey, [value intValue]];
解决了问题。在研究了苹果文档之后,似乎
%@
应该可以工作了。所以我不是100%知道为什么这可以解决问题。关于ios - NSFetchRequest有时仅返回结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24158618/