我的数据库类中有一个方法可以验证给定值是否存在于实体中。一切工作都很好,除了我正在尝试优化此方法。你们能让我知道是否可以进一步优化此代码吗?

- (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/

10-11 19:47
查看更多