谓词使用coredata获取父文件夹中的子文件和文件夹

时间:2014-03-10 13:06:08

标签: ios iphone core-data nspredicate nsfetchrequest

我的应用核心数据实体看起来像enter image description here

应用程序基本上打算像目录一样工作,用户可以在其中添加自己的文件和文件夹。

我需要在文件夹内提供搜索功能,用户可以在其中搜索具有特定值的文件或文件夹(需要遍历所有子级别中的子文件和子文件夹)。

我们可以使用NSPredicate和NSFetchrequest来做到这一点吗?

请建议。

2 个答案:

答案 0 :(得分:1)

如果您的FileFolder有许多共同点......
我会改变我的模型:

  1. 创建一个具有属性的Node抽象基类:
    标识
    标题
    关系:
    父母 - 一对 - > Node
  2. Folder继承Node并添加关系:
    儿童 - 多对 - >> Node
  3. File继承Node并添加属性:
    mime类型
    所有者
  4. 考虑到这将创建一个包含所有这些属性和关系的单个表(在当前CoreData实现下)。

    现在,您可以在模型中搜索标题与给定字符串匹配的节点(FileFolder s)。使用谓词:

    [NSPredicate predicateWithFormat:@"title CONTAINS[cd] %@",searchText]
    

    然而......这不是一个完整的解决方案,因为您无法将搜索范围限制在给定的父级Node

    如果您需要限制搜索,可以通过向名为Node的{​​{1}}实体添加另一个多对多关系,为每个Node保留一个父列表。此父项集将设置为parents Node关系设置,方法是设置新节点父parent,处理它并将父项添加到其中,然后将其设置为新节点。

    这将允许使用谓词进行更精细的搜索:

    parents

    这可以进行优化,以便节点可以只指向特定的父节点,而不会反复处理它,但这有点复杂。

    你也可以使用nested setsnested intervals实施......但我想这需要你做很多工作。

    此处的所有请求均在[NSPredicate predicateWithFormat:@"ANY parents = %@ AND title CONTAINS[cd] %@",baseNode,searchText] 实体

    上完成

答案 1 :(得分:0)

你必须做两个请求:一个用于文件夹,一个用于像这样的文件

 - (NSArray*) getFilesOrFoldersWithName:(NSString*) name {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Folder"
                                          inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setResultType:NSDictionaryResultType];

NSPredicate *predicate=[NSPredicate predicateWithFormat:@"title CONTAINS[cd] %@ ", name];
[fetchRequest setPredicate:predicate];

NSError* error;
NSArray *fetchedRecords = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

if (error) {
    NSLog(@"Error %@",error);
}

return fetchedRecords;
}