如何将 NSPredicate 与链式虚拟 属性 一起使用?
How to use NSPredicate with chained virtual property?
假设有两个由 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")'
您不能在获取请求谓词中使用瞬态属性,这是因为您尝试使用的数据在 SQLite 数据库中不存在。
您需要重写谓词以仅使用 firstname
和 last name
。
您可能希望使用 BEGINSWITH
和 ENDSWITH
执行此操作,然后您可能还希望 运行 获得提取结果后的第二个过滤器,以确保您不会结果集中没有任何误报。
或者你可以把全名写成non-transient然后它就可以用在谓词中了。在这种情况下,您将实现自定义访问器方法以确保任何更新也适用于全名。
假设有两个由 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")'
您不能在获取请求谓词中使用瞬态属性,这是因为您尝试使用的数据在 SQLite 数据库中不存在。
您需要重写谓词以仅使用 firstname
和 last name
。
您可能希望使用 BEGINSWITH
和 ENDSWITH
执行此操作,然后您可能还希望 运行 获得提取结果后的第二个过滤器,以确保您不会结果集中没有任何误报。
或者你可以把全名写成non-transient然后它就可以用在谓词中了。在这种情况下,您将实现自定义访问器方法以确保任何更新也适用于全名。