iOS - 当字符串以算术运算符+ - * /开头时,NSPredicate string.length总是求值为0

时间:2014-03-31 16:27:48

标签: core-data nspredicate

我有一个简单的方法,它使用NSPredicate返回其中的行数,其中comments.length> 0

问题是,我发现当Comment列以+ - *或/开头时,length属性总是计算为0,因此该行将从计数中排除。

我在SQLite浏览器中打开了表,并验证了该列是VARCHAR。使用SQLite查询检查字符串长度工作得很好(LENGTH(ZComments)> 0),所以这必须是CoreData问题。

这是我的功能......

-(int)getCommentsCount{
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
    [request setIncludesSubentities:YES];
    [request setEntity:[NSEntityDescription entityForName:@"InspectionRecord" inManagedObjectContext:managedObjectContext]];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(comments.length > 0)"];
    [request setPredicate:predicate];

    NSError *err;
    NSUInteger count = [managedObjectContext countForFetchRequest:request error:&err];

    //count is ALWAYS 0 if 'comments' starts with + - * or /     WHYYY???      
    return count;
}

我能够通过检查空/空字符串而不是使用.length来解决这个问题,但是我真的很想知道。当字符串以某些字符开头时.length会失败。

这是否发生在任何人身上?

1 个答案:

答案 0 :(得分:7)

您无法在核心数据提取请求中使用length之类的Objective-C函数 (当Core Data转换获取请求时,简单地忽略" .length"部分 到SQLite查询)。但你可以简单地用空字符串进行比较:

 [NSPredicate predicateWithFormat:@"comment != ''"]

对于涉及长度的其他查询,可以使用MATCHES运算符 正则表达式如下所示:CoreData predicate: string property length?