在核心数据谓词中为元素名称使用变量
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 变量,它将参数视为键而不是值。现在工作 =) 不客气 :) 核心数据和谓词是很棒的技术,你可以用它们做任何事情......以上是关于在核心数据谓词中为元素名称使用变量的主要内容,如果未能解决你的问题,请参考以下文章