筛选层次结构

时间:2014-05-27 06:33:56

标签: ios objective-c core-data hierarchy hierarchical-data

我正在编写一个包含Core Data的应用程序,该应用程序必须维护一个具有4级层次结构的目录。

Category <--->> SubCategory <--->> Item <--->> SubItem

我有一个屏幕(表格/集合视图),其中ItemsCategorySubCategory标题一起显示。物品可以是。 基本上我必须显示过滤目录。让我们说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过滤深层嵌套的层次结构? 主要问题:有没有办法在对其根运行获取请求时获取深层嵌套对象树的叶子?

2 个答案:

答案 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]];

如果您需要考虑categorysubCategory对结果进行排序,您可以根据自己的优先级使用更多排序描述符,

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]];