以下是 find-or-create 代码:
+ (id)checkIfEntity:(NSString *)entityName
withIDValue:(NSString *)entityIDValue
forIDKey:(NSString *)entityIDKey
existsInContext:(NSManagedObjectContext *)context
{
// Create fetch request
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setReturnsObjectsAsFaults:NO];
// Fetch messages data
NSEntityDescription *description = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
[request setEntity:description];
// Only include objects that exist (i.e. entityIDKey and entityIDValue's must exist)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@=%@", entityIDKey, entityIDValue];
[request setPredicate:predicate];
// Execute request that returns array of dashboardEntrys
NSArray *array = [context executeFetchRequest:request error:nil];
if ( [array count] ) {
NSLog(@"%@ = %@ DOES EXIST", entityIDKey, entityIDValue);
return [array objectAtIndex:0];
}
NSLog(@"%@ = %@ DOES NOT EXIST", entityIDKey, entityIDValue);
return [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:context];
}
请忽略这样一个事实,即我没有采用最佳做法,只有两个返回语句 - 我会在将代码推送到生产之前将其用作。
它通过传递带有entityName
的NSManagedObject实体来工作,并且具有NSPredicate,用于检查entityIDKey
是否具有值entityIDValue
; entityIDKey = entityIDValue
。我也试过使用==
。
无论我使用哪种比较方法,都不会命中if ( [array count] )
方法,因此第二个NSLog
语句总是会输出,描述我知道的核心数据存储中存在的对象不存在实际存在。因此,当我去显示我的商店的内容时,我最终得到了许多重复的条目。
我的NSPredicate声明是否正确?
`NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@=%@", entityIDKey, entityIDValue];`
其中entityIDKey = @"userID"
和entityIDvalue = @"1234567890"
谢谢!
答案 0 :(得分:0)
是的,问题绝对是谓词。
谓词参数应该是:
%K == %@
不
%@ = %@