我正在尝试编写一个方法,该方法尝试使用变量(作为NSXMLParser的一部分)基于谓词检索对象。代码如下所示:
我在类中定义了这些变量:
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) NSString *model;
@property (strong, nonatomic) NSString *element;
现在在方法中,我设置了这样的请求:
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:self.model inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity];
现在挑战 - 我想要能够做的是:
// DOES NOT WORK
[request setPredicate:[NSPredicate predicateWithFormat:@"%@ == %@", self.element,string]];
但这不会返回任何结果。经过一段时间后,我注意到确实工作:
if ( [self.element isEqualToString:@"name"] ) {
[request setPredicate:[NSPredicate predicateWithFormat:@"name == %@", string]];
}
这告诉我我的self.element
设置正确(我认为?)但是谓词不喜欢表达式的左侧是变量。
我也尝试过:
[request setPredicate:[NSPredicate predicateWithFormat:@"%s == %@", [self.element UTF8String],string]];
...只是为了看看它是否更喜欢一个字符串。我也无法做到这一点。
我正在尝试甚至可能吗?我已经尽可能多地阅读了Core Data文档,我找不到任何以这种方式执行的示例代码,但我也没有发现任何可以说它不可能的内容。
编辑: 现在是工作代码:
[request setPredicate:[NSPredicate predicateWithFormat:@"%K == %@", self.element,string]];
答案 0 :(得分:14)
如果您以前没有这样做,请阅读Predicate Programming Guide,您可以找到有关谓词的所有内容。
现在,如果我理解正确,你想在两个字符串之间创建一个谓词,但第一个不是已定义的字符串,但它可以改变。
我之前没有使用它们,但我相信你可以通过使用带有动态属性名称的谓词来解决你的问题。
此处来自文档:
动态媒体资源名称
因为字符串变量被包围 使用时将引号替换为格式字符串时的引号%@
,您无法使用%@
指定动态属性名称 如下例所示。NSString *attributeName = @"firstName"; NSString *attributeValue = @"Adam"; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ like %@", attributeName, attributeValue];
在这种情况下,谓词格式字符串的计算结果为“firstName”,如“Adam”。
如果要指定动态属性名称,请在中使用
%K
格式化字符串,如下面的片段所示。predicate = [NSPredicate predicateWithFormat:@"%K like %@", attributeName, attributeValue];
在这种情况下,谓词格式字符串的计算结果为firstName,如“Adam”(请注意,没有 firstName周围的引号)。
此处还可以找到更多信息:Predicate Format String Summary。