假设Sqlite支持两个ManagedObject:
1。)User
有两个属性firstname
和lastname
以及一个只读的虚拟(瞬态)属性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")'
答案 0 :(得分:2)
您不能在获取请求谓词中使用瞬态属性,这是因为您尝试使用的数据在SQLite数据库中不存在。
您需要重写谓词才能仅使用firstname
和last name
。
您可能希望使用BEGINSWITH
和ENDSWITH
执行该操作,然后您可能还希望在获取结果后运行第二个过滤器,以确保您没有任何误报在结果集中。
或者,您可以将全名设为非瞬态,然后可以在谓词中使用它。在这种情况下,您将实现自定义访问器方法,以确保任何更新也适用于全名。