0

我的数据库类中有一个方法可以验证给定值是否存在于实体中。除了我正在尝试优化此方法外,一切都运行良好。你们能告诉我这段代码是否可以进一步优化吗?

- (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;
}

干杯

4

1 回答 1

1

我有两个建议:

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

LIKE使用简单的通配符 ( *, ?) 进行比较,因此例如搜索“J*”也会找到条目“John”。这比测试相等性要慢,并且可能不是故意的。

  • 为属性创建索引。

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

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

于 2013-02-26T10:54:15.877 回答