如何将NSPredicate与链式虚拟财产一起使用?

时间:2016-01-04 13:39:34

标签: ios objective-c core-data nspredicate

假设Sqlite支持两个ManagedObject:

1。)User有两个属性firstnamelastname以及一个只读的虚拟(瞬态)属性fullname

@interface User : NSManagedObject
...
@property NSString *firstname;
@property NSString *lastname;
@property (readonly) NSString *fullname;
@end

@implementation User
...
- (NSString*)fullname
{
   return [NSString stringWithFormat:@"%@ %@", self.firstname, self.lastname];
}
@end

2。)一个Message除了其他几个属性外,还与sender属性中存储的一个用户的关系。

@interface Message : NSManagedObject
@property User *sender;
@end

我想用特定发件人的全名来获取所有Message实例。这是我正在构建的NSPredicate:

[NSPredicate predicateWithFormat:@"sender.fullname CONTAINS[cd] %@", @"Searched Name"]]

不幸的是,一旦我开始搜索,我就会收到NSInvalidArgumentException

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'unimplemented SQL generation for predicate : (sender.fullname CONTAINS[cd] "S")'

1 个答案:

答案 0 :(得分:2)

您不能在获取请求谓词中使用瞬态属性,这是因为您尝试使用的数据在SQLite数据库中不存在。

您需要重写谓词才能仅使用firstnamelast name

您可能希望使用BEGINSWITHENDSWITH执行该操作,然后您可能还希望在获取结果后运行第二个过滤器,以确保您没有任何误报在结果集中。

或者,您可以将全名设为非瞬态,然后可以在谓词中使用它。在这种情况下,您将实现自定义访问器方法,以确保任何更新也适用于全名。