NSPredicate和CoreData?

时间:2012-09-30 20:48:58

标签: objective-c ios core-data nspredicate

如果直接添加到谓词

,查询工作正常
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"author == %@", author];
[request setPredicate:predicate];
[self.managedObjectContext executeFetchRequest:request error:nil];

查询在创建后无效,然后传递给谓词

有解决方案吗?我宁愿不将谓词本身传递给方法

作者是NSManagedObject的子类

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "%@"'

[self fetchObjectsWithQuery:[NSString stringWithFormat:@"author == %@", author];

- (void)fetchObjectsWithQuery:(NSString *)query
{
   NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@", query];
   [request setPredicate:predicate];
   [self.managedObjectContext executeFetchRequest:request error:nil];
}

2 个答案:

答案 0 :(得分:2)

格式字符串在

中的工作方式不同
NSString *query = [NSString stringWithFormat:@"author == %@", author] // (1)

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"author == %@", author]

特别是占位符“%@”和“%K”具有不同的含义。

(1)生成形式的字符串

"author == <textual description of author object>"

,你不能在

中使用
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@", query];

因此,您无法将谓词预格式化为字符串。另一个证明问题的例子:

[NSPredicate predicateWithFormat:@"author == nil"]

有效,但

[NSPredicate predicateWithFormat:"%@", @"author == nil"]

没有。

答案 1 :(得分:0)

没有充分的理由不创建和传递NSPredicate个对象。有很多方法可以完全按照您的要求进行操作,但它们要么不仅仅使用谓词,要么需要复制NSPredicate下面的逻辑。