如何使用链式虚拟财产的NSPredicate?

假设两个由Sqlite支持的ManagedObject:

1.)具有两个属性的Userfirstnamelastname以及只读的虚拟(临时)属性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 

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

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

不幸的是,一旦我开始search,我得到一个NSInvalidArgumentException

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

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

您需要重写谓词以仅使用last namelast name

您可能想要使用BEGINSWITHENDSWITH来做到这ENDSWITH ,然后您可能还想在获取提取结果后再运行第二个filter,以确保结果集中没有任何误报。

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