将实体的自定义字段与 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 一起使用 [关闭]