Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 过滤器层次结构_Ios_Objective C_Core Data_Hierarchy_Hierarchical Data - Fatal编程技术网

Ios 过滤器层次结构

Ios 过滤器层次结构,ios,objective-c,core-data,hierarchy,hierarchical-data,Ios,Objective C,Core Data,Hierarchy,Hierarchical Data,我正在编写一个包含核心数据的应用程序,它必须维护一个具有4个层次结构的目录 Category <--->> SubCategory <--->> Item <--->> SubItem 使用查询“ab”进行筛选后,我希望看到以下对象: Category: Category 1 SubCategory: SubCategory 1.1 Items: [abc, abd, abg] Category: Category 2 S

我正在编写一个包含核心数据的应用程序,它必须维护一个具有4个层次结构的目录

Category <--->> SubCategory <--->> Item <--->> SubItem
使用查询“ab”进行筛选后,我希望看到以下对象:

Category: Category 1
  SubCategory: SubCategory 1.1
    Items: [abc, abd, abg] 
Category: Category 2
  SubCategory: SubCategory 2.1
    Items: [123ab, 456ab]
问题是:我不能对
Category
使用fetch请求,因为它只会显示包含满足条件的项的类别,但不会过滤项。 我可以直接获取过滤后的
项的集合
,但我必须重建结构
类别-子类别-项
,并将其放入一些数组/字典等

有没有更好的方法用CoreData过滤深度嵌套的层次结构?
主要问题:在对其根运行fetch请求时,是否有一种方法可以获取嵌套较深的对象树的叶子?

您可以使用
搜索字符串
筛选

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]];
如果需要根据
类别
子类别
对结果进行排序,可以根据优先级使用更多排序描述符,如

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

您可以用一个“”分隔每个键。就像这样

NSSortDescriptor *sortDescriptorSubCategory = [[NSSortDescriptor alloc]initWithKey:@"Category.SubCategory.Items" ascending:YES];
然后,在iOS 7+中

[YOUR_ARRAY sortedArrayUsingDescriptors:@[sortDescriptorSubCategory]];
或者,旧的iOS版本

[YOUR_ARRAY sortedArrayUsingDescriptors:[NSArray sortDescriptorSubCategory, nil]];

我很难理解您想要过滤项目的标准。您是否可以详细介绍一下子项如何影响fetch request添加了示例和更新的描述。您是否可以发布用于筛选的
fetch request
[YOUR_ARRAY sortedArrayUsingDescriptors:[NSArray sortDescriptorSubCategory, nil]];