我的Database类中有一个方法可以验证给定值是否存在于实体中。除了我正在尝试优化这种方法之外,一切都工作得非常好。你能告诉我这段代码是否可以进一步优化吗?
- (NSUInteger)recordAlreadyExists:(NSString*)string forEntity:(NSString*)entityName forKey:(NSString*)key
{
NSManagedObjectContext *newContext = [Helper generateNewContext];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:newContext];
[newContext setUndoManager:nil];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
[fetchRequest setEntity:entity];
[fetchRequest setFetchLimit:1];
//NSString *predicateString = [NSString stringWithFormat:@"%K LIKE \"%@\"", key, string];//,key,string];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K LIKE %@", key, string];
[fetchRequest setPredicate:predicate];
NSError *error;
NSUInteger resultsCount = [newContext countForFetchRequest:fetchRequest error:&error];
if(resultsCount)
return resultsCount;
return 0;
}
干杯
答案 0 :(得分:1)
我有两点建议:
"%K == %@"
,而不是"%K LIKE %@"
。 LIKE
使用简单的通配符(*
,?
)进行比较,以便例如搜索" J *"也会找到一个条目" John"。这比测试相等性要慢,可能并不打算。
如果您必须非常快速地搜索某些属性,则可以设置"索引"该属性的Core Data检查器中的属性。
备注:请注意,如果执行请求时出错,countForFetchRequest:
将返回NSNotFound
,因此您还应检查该返回值。