在一对多关系中使用 NSPredicate 进行过滤
Posted
技术标签:
【中文标题】在一对多关系中使用 NSPredicate 进行过滤【英文标题】:Filtering with NSPredicate in one-to-many relationships 【发布时间】:2012-01-27 12:21:35 【问题描述】:我在 *** 中尝试了很多解决方案,但找不到有效的解决方案。我有一个包含两个实体的核心数据模型:客户端和目标。两者都由NSManagedObject
subclasses 包装。
客户端有一些属性和一对多的关系,称为目的地。
Destination 有一个名为 default_dest 的属性,该属性由 NSNumber
和一个名为 client 的反向关系包装。
我有一个UITableViewController
,我正在使用以下fetchedController
属性。该请求运行良好。我能够检索存储在 SQLite 中的客户端。
if (fetchedResultsController)
return fetchedResultsController;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Client" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:20];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"code" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
fetchedResultsController.delegate = self;
[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];
return fetchedResultsController;
我会再迈出一步。我现在将为每个客户端过滤从上一个请求中检索到的目标(包含在目标NSSet
中)。特别是,只有当其 default_dest 值为 1 时,才能添加目的地。
为了修复这个规范,我尝试添加一个NSPredicate
,如下所示:
NSPredicate* predicate = [NSpredicate predicateWithFormat:@"ANY destinations.default_dest == %@", [NSNumber numberWithInt:1]];
然后我在 fetchRequest 中设置为:
[fetchRequest setPredicate:predicate];
每次我运行请求时,它都会返回一个“多关系错误目的地...”。什么意思?
我读过iphone-core-data-relationship-fault,但我不明白这是什么意思。
所以,我的问题是:是否有可能达到类似的目标?如果有,您有什么建议吗?
备注
显然我可以迭代目的地集,但我不知道这是否会是一个昂贵的迭代以及有多少记录。
【问题讨论】:
【参考方案1】:对于那些有兴趣的人。
你需要告诉你的获取请求来预取关系使用
- (void)setRelationshipKeyPathsForPrefetching:(NSArray *)keys
例如:
[fetchRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObjects: @"destinations", nil]];
以这种方式,Core Data 预取您指定的关系并且不会触发错误。
此外,您可以通过以下方式限制获取请求的结果数量:
- (void)setFetchLimit:(NSUInteger)limit
希望对你有帮助。
【讨论】:
【参考方案2】:这是在 fetch 中检索特定值的另一种方法。也许这会有所帮助(在文档中查找链接名称):
Fetching Specific Values
【讨论】:
以上是关于在一对多关系中使用 NSPredicate 进行过滤的主要内容,如果未能解决你的问题,请参考以下文章