Core data 当字符串以算术运算符+;-*/
我有一个简单的方法,使用NSPredicate返回comments.length>0的行数 问题是,我发现当注释列以+-*或/开头时,length属性的计算结果总是为0,因此该行被排除在计数之外 我在SQLite浏览器中打开了该表,并验证了该列是否为VARCHAR。使用SQLite查询检查字符串长度效果很好(length(ZComments)>0),所以这一定是CoreData的问题 这是我的功能Core data 当字符串以算术运算符+;-*/,core-data,nspredicate,Core Data,Nspredicate,我有一个简单的方法,使用NSPredicate返回comments.length>0的行数 问题是,我发现当注释列以+-*或/开头时,length属性的计算结果总是为0,因此该行被排除在计数之外 我在SQLite浏览器中打开了该表,并验证了该列是否为VARCHAR。使用SQLite查询检查字符串长度效果很好(length(ZComments)>0),所以这一定是CoreData的问题 这是我的功能 -(int)getCommentsCount{ NSFetchRequest *reque
-(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失败的原因
有人遇到过这种情况吗?您不能在核心数据获取请求中使用像
length
这样的Objective-C函数
(当核心数据转换获取请求时,“.length”部分被忽略
到SQLite查询)。但您可以简单地与空字符串进行比较:
[NSPredicate predicateWithFormat:@"comment != ''"]
对于涉及长度的其他查询,可以使用MATCHES运算符
如下所示的正则表达式:.不是错误的原因,但方法签名应该是
-(NSUInteger)commentsCount
。匹配-countForFetchRequest:error:
的返回类型,并且不要使用get
启动方法名称,除非它们间接返回多个项()。此外,使用.length
有时可能有效的原因是核心数据将comments.length>0
转换为SQL,类似于t0.ZCOMMENTS>0
,从而丢失查询的“长度”部分。对我来说,这似乎是个错误,但目前情况就是这样。我不知道SQLite如何在>0
比较中计算字符串,但这不是注释所暗示的。长度
。非常好的解释,谢谢!我甚至通过将“.length”更改为“.foo”来验证这一点,并得到了相同的结果。使用NSPredicate比较字符串长度是否合法?此外。。。。最好有人告诉另一条线上的人他们做错了@iupchris10:“comment.length>0”和类似内容在过滤数组时有效。它仅对核心数据获取请求失败(答案的一条注释中已经提到)。@iupchris10:其他字符串长度比较可以使用正则表达式完成(如我链接的答案所示)。@MartinR-谢谢。我还偶然发现了这个线程,它建议在托管对象中添加一个长度属性,并在文本值更改时进行设置。-[连结]