在Core Data Predicate中使用元素名称的变量

时间:2012-02-13 14:04:46

标签: ios core-data predicate

我正在尝试编写一个方法,该方法尝试使用变量(作为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]];

1 个答案:

答案 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