2013-03-06 114 views
0

我有核心数据实体字段的属性为ID。我想搜索所有现场实体ID == 1,2,或3NSPredicate与NSArray的NSNumbers(核心数据)

我如何添加一个数组到NSPredicate瓦特/创建一个长串附加类似:

NSArray *IDArray = @[@1, @2, @3]; 

NSMutableString *predicateString = [NSMutableString string]; 

for (NSNumber *ID in IDArray) { 
    [predicateString appendString:[NSString stringWithFormat:@"ID == %@, ID]]; 
} 
+0

就像一个音符 - 正常的Objective-C约定会有实例和局部变量以小写字母开头。这使得您的代码片段更易于为其他人阅读。 – Monolo 2013-03-06 18:14:11

+0

xCode将假设'id'是一个类的类型。我一直认为缩写应该大写?我猜IDArray对我有意义。我是否应该重命名,以便名称不以大写的缩写(例如'arrayOfIDs')开头? – Padin215 2013-03-06 18:22:22

+0

我相信这是个人品味的问题。我承认将它输出为'ident'或'identifier',使编译器感到高兴。 – Monolo 2013-03-06 18:54:39

回答

2

这应工作:

NSArray *IDArray = @[@1, @2, @3]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ID IN %@", IDArray]; 

注:你不应该使用字符串格式化函数谓词结合起来。使用

[NSCompoundPredicate orPredicateWithSubpredicates:...] 

和类似的方法。原因是字符串和谓词有不同的规则如何扩展格式说明符。

+0

好吧,我看到这用于字符串,我不知道它是否也适用于NSNumbers,谢谢! – Padin215 2013-03-06 18:23:11

+0

@ Log139:即使该属性具有Integer类型,并且该数组包含字符串,它仍然有效:该类型根据需要进行转换。 - 如果有帮助,请考虑“接受”答案,谢谢。 – 2013-03-06 18:30:19

+0

我第一次试图接受,告诉我等30秒,所以开始编码,忘了回来接受= D – Padin215 2013-03-06 18:57:45