在核心数据谓词中为元素名称使用变量

Posted

技术标签:

【中文标题】在核心数据谓词中为元素名称使用变量【英文标题】:Using a variable for Element name in Core Data Predicate 【发布时间】:2012-02-13 14:04:45 【问题描述】:

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

如果您以前没有这样做过,请阅读Predicate Programming Guide,您可以找到有关谓词的所有信息。

现在,如果我理解正确,您想在两个字符串之间创建一个谓词,但第一个不是已定义的字符串,但它可以更改。 我以前没有使用过它们,但我相信您可以通过使用带有动态属性名称的谓词来解决您的问题。

来自文档:

动态属性名称 因为字符串变量被包围 使用引号将它们替换为格式字符串时 %@,您不能使用 %@ 指定动态属性名称 — 如 如下例所示。

NSString *attributeName = @"firstName";  
NSString *attributeValue = @"Adam";  
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ like %@", attributeName, attributeValue];  

在这种情况下,谓词格式字符串的计算结果为“firstName”,如“Adam”。

如果要指定动态属性名称,请在 格式字符串,如下片段所示。

predicate = [NSPredicate predicateWithFormat:@"%K like %@", attributeName, attributeValue];  

在这种情况下,谓词格式字符串的计算结果为 firstName,如“Adam”(请注意,没有 firstName 周围的引号)。

更多信息也可以在这里找到:Predicate Format String Summary。

【讨论】:

这是完美的,谢谢。使我的代码工作的特定信息是 %K 变量,它将参数视为键而不是值。现在工作 =) 不客气 :) 核心数据和谓词是很棒的技术,你可以用它们做任何事情......

以上是关于在核心数据谓词中为元素名称使用变量的主要内容,如果未能解决你的问题,请参考以下文章

核心数据谓词 - 检查数组中的任何元素是不是与另一个数组中的任何元素匹配

核心数据:有序关系中第一个元素的谓词

核心数据谓词对多

对许多人的核心数据谓词

与包含的一对多关系的核心数据谓词

核心数据谓词根据关系获取数据,错误为无法解析格式字符串