在一对多关系中使用 NSPredicate 进行过滤

Posted

技术标签:

【中文标题】在一对多关系中使用 NSPredicate 进行过滤【英文标题】:Filtering with NSPredicate in one-to-many relationships 【发布时间】:2012-01-27 12:21:35 【问题描述】:

我在 *** 中尝试了很多解决方案,但找不到有效的解决方案。我有一个包含两个实体的核心数据模型:客户端和目标。两者都由NSManagedObjectsubclasses 包装。

客户端有一些属性和一对多的关系,称为目的地。 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 进行过滤的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate 与 AND 在一对多关系中

NSPredicate,使用一对多关系的子集获取结果

使用 NSPredicate 获取一对多关系值

NSPredicate:“添加”一对多关系CoreData中所有实体的属性值

核心数据:NSPredicate 一对多对多关系

iOS:“@count == 0”的 NSPredicate 用于一对一和一对多关系