iOS - 当字符串以算术运算符 + - * / 开头时,NSPredicate string.length 始终计算为 0

Posted

技术标签:

【中文标题】iOS - 当字符串以算术运算符 + - * / 开头时,NSPredicate string.length 始终计算为 0【英文标题】:iOS - NSPredicate string.length always evaluates to 0 when string starts with arithmetic operators + - * / 【发布时间】:2014-03-31 16:27:48 【问题描述】:

我有一个简单的方法,它使用 NSPredicate 返回 cmets.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 会失败。

有人遇到过这种情况吗?

【问题讨论】:

不是你的错误的原因,但方法签名应该是-(NSUInteger)commentsCount。匹配-countForFetchRequest:error:的返回类型,方法名不要以get开头,除非它们间接返回多个项目(Cocoa Naming Conventions)。 【参考方案1】:

你不能在 Core Data 获取请求中使用像 length 这样的 Objective-C 函数 (当 Core Data 翻译 fetch 请求时,“.length”部分会被忽略 到 SQLite 查询)。但是您可以简单地与空字符串进行比较:

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

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

【讨论】:

此外,使用.length 有时可能会起作用的原因是Core Data 会将comments.length > 0 转换为SQL,就像t0.ZCOMMENTS > 0 一样,丢失了查询的“长度”部分。 对我来说似乎是一个错误,但目前就是这样。我不知道 SQLite 如何在 > 0 比较中评估字符串,但这不是 comments.length 所暗示的。 很好的解释,谢谢!我什至通过将“.length”更改为“.foo”来验证这一点,并得到了相同的结果。是否有使用 NSPredicate 比较字符串长度的合法方法?此外……有人最好告诉其他线程上的人他们做错了……***.com/questions/7369390/… @iupchris10: "comment.length > 0" 和类似的确实有效,例如过滤数组。它仅对核心数据获取请求失败(并且已经在对答案的评论中提到)。 @iupchris10:其他字符串长度比较可以用正则表达式完成(如我链接到的答案)。 @MartinR - 谢谢。我也偶然发现了这个线程,它建议向托管对象添加一个长度属性,并在文本值更改时设置它。 - [链接]***.com/questions/3644621/…

以上是关于iOS - 当字符串以算术运算符 + - * / 开头时,NSPredicate string.length 始终计算为 0的主要内容,如果未能解决你的问题,请参考以下文章

java运算符

java学习之运算符

C ++中的算术溢出添加2个DWORD

linux基础--Bash编程基础

运算符

Dijkstra的双栈算术表达式的求值算法