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

时间:2012-01-27 12:21:36

标签: core-data nspredicate one-to-many relationship nsfetchrequest

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

客户端具有一些属性和称为目标的一对多关系。 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];

每次运行请求时,它都会返回“to-many-relationship fault destinations ...”。这是什么意思?

我读过iphone-core-data-relationship-fault,但我不明白它是什么意思。

所以,我的问题是:是否有可能达到类似的目标?如果是的话,你有什么建议吗?

备注

显然我可以迭代目标集,但我不知道是否可能是一个昂贵的迭代以及有多少记录。

2 个答案:

答案 0 :(得分:3)

对于那些对此感兴趣的人。

您需要对您的提取请求说明使用

预取关系
- (void)setRelationshipKeyPathsForPrefetching:(NSArray *)keys

例如:

[fetchRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObjects: @"destinations", nil]];

以这种方式,Core Data预取您指定的关系并且不会触发故障。

此外,您可以通过以下方式限制获取请求的结果数量:

- (void)setFetchLimit:(NSUInteger)limit

希望它有所帮助。

答案 1 :(得分:-1)

这是在fetch中检索特定值的另一种方法。也许这可以提供帮助(在文档中查找链接名称):

Fetching Specific Values