我有一个DataModel,它有一个Category,SubCategory和DetailedItem实体。类别与SubCategory具有1对多。每个SubCategory与DetailedItem具有1对多的关系。因此,类别具有一组子类别,并且对于每个子类别,它具有一组详细项目。
类别具有subCategories的Set属性和Name属性。 SubCategory具有detailItems的Set属性,Name属性和Category父属性
我的问题是如何使用NSFetchedResultsController从给定类别中的给定SubCategory中检索所有详细项目。
我正在尝试这样的事情,但我认为我的NSPredicate不正确
if (__fetchedResultsController == nil) {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"DetailedItem" inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:entityDescription];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Category.name CONTAINS[c] 'Movies'"];
[fetchRequest setPredicate:predicate];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; // probably not needed
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
NSFetchedResultsController *fetchedResults = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[self managedObjectContext] sectionNameKeyPath:nil cacheName:@"AllItems"];
fetchedResults.delegate = self;
__fetchedResultsController = fetchedResults;
NSError *error;
if (![__fetchedResultsController performFetch:&error]) {
NSLog(@"Error fetching");
}
[sortDescriptor release];
[fetchRequest release];
}
目标是如果Category == Food and SubCategory == Meat,那么我将获得属于该类别&的所有详细项目的列表。子类别。如果有什么不清楚,我会尝试提供更多的背景。
答案 0 :(得分:1)
如果您的数据模型如下:
Category{
name:string
subCategories<-->>SubCategory.category
}
SubCategory{
name:string
category<<-->Category.subCategories
detailedItems<-->>DetailItem.subCategory
}
DetailedItem{
name:string
subCategory<<-->SubCategory.detailedItems
}
...并且您需要一个DetailedItem
个对象的表,您将获取实体设置为DetailedItem
,然后您的所有密钥路径都从DetailItem
实体开始。
如果您只拥有Category
和SubCategory
对象的名称,那么您可以构建一个谓词:
NSPredicate *p = [NSPredicate predicateWithFormat:@"subCategory.name==%@ AND subCategory.category.name==%@", subCatName,catName];
请注意,如果任一实体的对象中有重复的名称值,您将获得所有匹配的对象。
如果您手头有实际的Category
和SubCategory
个对象,可以使用以下方法进行更快速的测试:
NSPredicate *p = [NSPredicate predicateWithFormat:@"subCategory==%@ AND subCategory.category==%@", aSubCatObj,aCatObj];