iOS Core Data如何使用谓词正确比较字符串文本?

时间:2012-03-22 15:11:41

标签: objective-c ios core-data nsstring nspredicate

这实际上让我疯了。

我有2个实体使用NSStrings作为唯一属性。

创建比较NSStrings的谓词的正确方法是什么?

目前我有:     [NSPredicate predicateWithFormat:@“unique =%@”,uniqueValue];

我觉得这会比较指针地址,而不是实际的字符串值,但我无法确认。我需要返回yes以进行精确的字符串匹配。

-(BOOL)uniqueEntityExistsWithEnityName:(NSString*)entityName UniqueKey:(NSString*) uniqueKey UniqueValue:(NSString*)uniqueValue SortAttribute:(NSString*)sortDescriptorAttribute ManagedObjectContext:(NSManagedObjectContext*) context;
{
    BOOL returnValue = NO;

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];

//what is the correct predates to compare the text an string core data property against a passed in string?
    request.predicate = [NSPredicate predicateWithFormat:@"unique= %@", uniqueValue];

    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:sortDescriptorAttribute ascending:YES];
    request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];   

    NSError *error = nil;
    NSArray *matches = [context executeFetchRequest:request error:&error];
    if (!matches)
    {
         NSLog(@"Error: no object matches");
    }
    else if([matches count] > 1) {
        NSLog(@"Error: More than one object for unique record");
        returnValue = YES;

    } else if ([matches count] == 0) {
        returnValue = NO;
    } else {
        returnValue = YES;
    }

    return returnValue;
}

2 个答案:

答案 0 :(得分:9)

单个等号在编码方面甚至不是比较器。

我将假设unique是一个NSManagedObject属性。

[NSPredicate predicateWithFormat:@"unique LIKE %@", uniqueValue];

请注意,这是区分大小写的。如果你想让它变得不敏感,那么你可以把[c]放在LIKE之后。

答案 1 :(得分:7)

我没有看到你的谓词有问题。如果您想匹配完全字符串,则单个=是完美的。如果您不需要通配符匹配,则不需要较慢的LIKE。 (Predicate Format String Syntax

但是,您的代码中存在问题,并且可能会导致您做出不正确的假设。你的if / then / else,或者至少第一条消息是错误的。如果提取不返回数组,则意味着提取失败,并不意味着提取没有返回对象。

应该更像这样:

if (!matches)
{
    NSLog(@"Error: couldn't execute fetch request %@", error);
}
else if([matches count] > 1) {
    NSLog(@"Error: More than one object for unique record");
    returnValue = YES;
} else if ([matches count] == 0) {
    NSLog(@"couldn't match objects");
    returnValue = NO;
} else {
    // [matches count] == 1
    NSLog(@"matched one object");
    returnValue = YES;
}

哦,我会改变条件的顺序。在我看来,像(!匹配),([匹配计数] == 1),([匹配计数] == 0),(其他)这样的结构更有意义,而且更容易阅读。你把最重要的(因为这是你真正想要的)条件放在最后的“匿名”中。