提高核心数据重复验证的效率

时间:2013-02-26 10:43:20

标签: ios objective-c core-data

我的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;
}

干杯

1 个答案:

答案 0 :(得分:1)

我有两点建议:

  • 在谓词中测试完全相等"%K == %@",而不是"%K LIKE %@"

LIKE使用简单的通配符(*?)进行比较,以便例如搜索" J *"也会找到一个条目" John"。这比测试相等性要慢,可能并不打算。

  • 为属性创建索引。

如果您必须非常快速地搜索某些属性,则可以设置"索引"该属性的Core Data检查器中的属性。

备注:请注意,如果执行请求时出错,countForFetchRequest:将返回NSNotFound,因此您还应检查该返回值。