我的数据库类中有一个方法可以验证给定值是否存在于实体中。一切工作都很好,除了我正在尝试优化此方法。你们能让我知道是否可以进一步优化此代码吗?
- (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;
}
干杯
最佳答案
我有两个建议:
测试谓词中的完全相等性"%K == %@"
,而不是"%K LIKE %@"
。LIKE
使用简单的通配符(*
,?
)进行比较,例如,搜索“ J *”还将找到条目“ John”。这比测试相等性要慢,而且可能不是故意的。
创建该属性的索引。
如果您必须非常快速地搜索某些属性,则可以在核心数据检查器中为该属性设置“索引”属性。
备注:请注意,如果在执行请求时出错,则countForFetchRequest:
返回NSNotFound
,因此您还应该检查该返回值。
关于ios - 提高核心数据重复验证的效率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15087023/