“从”开始“谓词仅适用于硬编码数据

时间:2014-02-14 14:30:28

标签: objective-c core-data

我想知道是否有人可以回答这个问题。我在我的数据库中搜索具有属性名称的对象。我正在寻找名称以特定字母开头的任何对象。

如果我使用:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(name LIKE \"a*\")", toFind];
[request setPredicate:predicate];

NSArray *items = [context executeFetchRequest:request error:&error];

我可以找到以“a”开头的对象。

NSString *toFind = @"a";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(name LIKE \"%@*\")", toFind];
[request setPredicate:predicate];

NSArray *items = [context executeFetchRequest:request error:&error];

但是这个“项目”是空的。

如果我使用以下内容:

NSString *toFind = @"apple";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(name = %@)", toFind];
[request setPredicate:predicate];

NSArray *items = [context executeFetchRequest:request error:&error];

我在项目中得到一个名为“apple”的对象。

任何想法为什么这是......?

Ĵ

2 个答案:

答案 0 :(得分:2)

常量需要在第一个示例中使用双引号。如果要使用通配符传入变量,则需要传入完整的表达式:

NSString *variableWildcard = [NSString stringWithFormat:@"%@*", toFind];
[NSPredicate predicateWithFormat:@"(name LIKE %@)", variableWildcard]; // variable
[NSPredicate predicateWithFormat:@"(name LIKE \"a*\")", toFind];       // constant

答案 1 :(得分:0)

我回去重新阅读文档。如果我使用以下它可以工作:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(name LIKE[cd] %@)", [toFind stringByAppendingString:@"*"]];