我正在编写一个包含Core Data的应用程序,该应用程序必须维护一个具有4级层次结构的目录。
Category <--->> SubCategory <--->> Item <--->> SubItem
我有一个屏幕(表格/集合视图),其中Items
与Category
和SubCategory
标题一起显示。物品可以是。
基本上我必须显示过滤目录。让我们说Item有一个名字,我想按名称过滤项目。
实施例
Category: Category 1
SubCategory: SubCategory 1.1
Items: [aaa, bbb, ccc, abc, abd, abg]
SubCategory: SubCategory 1.2
Items: [aaa, bbb, ccc]
Category: Category 2
SubCategory: SubCategory 2.1
Items: [123ab, 456ab, 123, 345, 456]
使用查询过滤&#39; ab&#39;我想看到以下对象:
Category: Category 1
SubCategory: SubCategory 1.1
Items: [abc, abd, abg]
Category: Category 2
SubCategory: SubCategory 2.1
Items: [123ab, 456ab]
问题是:我无法对Category
使用获取请求,因为它只会向我显示包含符合条件的项目的类别,但不会过滤项目。
我可以直接获取Item
的过滤集合,但我必须重建结构Category - SubCategory - Item
并将其放在一些数组/字典等中。
有没有更好的方法来使用CoreData过滤深层嵌套的层次结构? 主要问题:有没有办法在对其根运行获取请求时获取深层嵌套对象树的叶子?
答案 0 :(得分:0)
您可以使用items
by,
searchString
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]initWithEntityName:@"Item"];
NSPredicate *predicate = nil;
if([_searchBar.text length] > 0){
predicate = [NSPredicate predicateWithFormat:@"itemName CONTAINS[cd] %@", _searchBar.text];
}
if(predicate){
[fetchRequest setPredicate:predicate];
}
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]initWithKey:@"itemName" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
如果您需要考虑category
和subCategory
对结果进行排序,您可以根据自己的优先级使用更多排序描述符,
NSSortDescriptor *sortDescriptorCategory = [[NSSortDescriptor alloc]initWithKey:@"categoryName" ascending:YES];
NSSortDescriptor *sortDescriptorSubCategory = [[NSSortDescriptor alloc]initWithKey:@"subCategoryName" ascending:YES];
NSSortDescriptor *sortDescriptorItem = [[NSSortDescriptor alloc]initWithKey:@"itemName" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptorCategory, sortDescriptorSubCategory, sortDescriptorItem, nil]];
答案 1 :(得分:0)
您只需将每个密钥与&#39; 分开即可...
NSSortDescriptor *sortDescriptorSubCategory = [[NSSortDescriptor alloc]initWithKey:@"Category.SubCategory.Items" ascending:YES];
然后,在iOS 7 +
中[YOUR_ARRAY sortedArrayUsingDescriptors:@[sortDescriptorSubCategory]];
或者,较旧的iOS版本
[YOUR_ARRAY sortedArrayUsingDescriptors:[NSArray sortDescriptorSubCategory, nil]];