我的应用核心数据实体看起来像
应用程序基本上打算像目录一样工作,用户可以在其中添加自己的文件和文件夹。
我需要在文件夹内提供搜索功能,用户可以在其中搜索具有特定值的文件或文件夹(需要遍历所有子级别中的子文件和子文件夹)。
我们可以使用NSPredicate和NSFetchrequest来做到这一点吗?
请建议。
答案 0 :(得分:1)
如果您的File
和Folder
有许多共同点......
我会改变我的模型:
Node
抽象基类:Node
Folder
继承Node
并添加关系:Node
File
继承Node
并添加属性: 考虑到这将创建一个包含所有这些属性和关系的单个表(在当前CoreData实现下)。
现在,您可以在模型中搜索标题与给定字符串匹配的节点(File
和Folder
s)。使用谓词:
[NSPredicate predicateWithFormat:@"title CONTAINS[cd] %@",searchText]
然而......这不是一个完整的解决方案,因为您无法将搜索范围限制在给定的父级Node
。
如果您需要限制搜索,可以通过向名为Node
的{{1}}实体添加另一个多对多关系,为每个Node
保留一个父列表。此父项集将设置为parents
Node
关系设置,方法是设置新节点父parent
,处理它并将父项添加到其中,然后将其设置为新节点。
这将允许使用谓词进行更精细的搜索:
parents
这可以进行优化,以便节点可以只指向特定的父节点,而不会反复处理它,但这有点复杂。
你也可以使用nested sets或nested 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;
}