将实体的自定义字段与 NSPredicate 一起使用

Posted

技术标签:

【中文标题】将实体的自定义字段与 NSPredicate 一起使用【英文标题】:Using an entity's custom field with NSPredicate 【发布时间】:2014-01-14 12:52:34 【问题描述】:

我正在尝试将自定义字段添加到实体,以便在使用 NSFetchedResultsController 获取对象时使用该字段创建谓词。该字段是全名:

@dynamic first_name;
@dynamic last_name;

@dynamic full_name;

-(NSString *)full_name 
    [self willAccessValueForKey:@"full_name"];
    NSString *name = [NSString stringWithFormat:@"%@ %@", self.first_name, self.last_name];
    [self didAccessValueForKey:@"full_name"];
    return name;

然后,使用 NSFetchedResultsController,我尝试通过 full_name 获取匹配的对象:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:[self managedObjectContext]];

[fetchRequest setEntity:entity];

NSArray *sortDescriptors = [NSArray arrayWithObject:[[NSSortDescriptor alloc] initWithKey:@"full_name" ascending:YES]];

NSMutableArray *predicateArray = [NSMutableArray array];
[predicateArray addObject:[NSPredicate predicateWithFormat:@"contact_full_name contains == '%@' ", trimmedSearchString]];

filterPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:predicateArray];

[fetchRequest setPredicate:filterPredicate];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest                                                                                     managedObjectContext:[self managedObjectContext] sectionNameKeyPath:nil cacheName:nil];

但是,查询始终返回空结果,即使查询的全名存在于数据存储中。任何想法为什么谓词不返回有效结果?

【问题讨论】:

【参考方案1】: 您的谓词使用“contact_full_name”,而不是“full_name”。 "… contains == '%@'" 应该是谓词中的"… contains %@"。 Core Data 获取请求只能对 persistent 属性进行过滤和排序,而不能对基于瞬态或基于 Objective-C 的自定义属性进行过滤和排序。

【讨论】:

(1) 和 (2) 是复制粘贴错误的结果,对不起!因此,除非我沿 first_name 和 last_name 存储一个 full_name(这将导致额外的存储消耗),否则我将不得不基于 first_name 和 last_name 的组合构建一个谓词...... @Joel:是的,没错。准确地说,这是对 SQLite 存储的限制。 (Core Data 编程指南中的某处有一个关于商店特定限制的部分。)

以上是关于将实体的自定义字段与 NSPredicate 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSPredicate contains 在 coredata 实体的字段中查找字符

将自己的自定义表单与 MailChimp 一起使用 [关闭]

NSPredicate 101:将 NSPredicate 与自定义对象的 NSMutableArray 一起使用

Spring REST API,响应中的自定义实体字段

将关系过滤器添加到 NSPredicate

Cocoa 中的自定义 NSPredicate