【问题标题】:How to use NSPredicate with chained virtual property?如何将 NSPredicate 与链式虚拟属性一起使用?
【发布时间】:2016-04-08 03:27:00
【问题描述】:

假设 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")'

【问题讨论】:

标签: ios objective-c core-data nspredicate


【解决方案1】:

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

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

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

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

【讨论】:

  • 作为一种 +1,我在我的项目中采用了替代方法,包括自定义设置器来更新依赖属性。归根结底,能够进行正确的提取(尤其是使用 NSFetchedResultsControllers)太重要了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
相关资源
最近更新 更多