核心数据目录(树)结构

时间:2014-02-10 00:38:18

标签: ios objective-c core-data treeview

核心数据树结构上有很多主题,但我还有一些问题。

我想要创建的是一个简单的目录结构。 (包含子文件夹的子文件夹的文件夹,......以及稍后的文件。)

我现在有了这个Folder实体: enter image description here

我正在添加这样的文件夹: [显然这是虚拟数据,这将在以后动态插入]

// root 1
Folder *root1 = [NSEntityDescription insertNewObjectForEntityForName:@"Folder" inManagedObjectContext:context];
root1.name = @"Root 1";
root1.parent = nil;

// folder 1 in root 1
Folder *subFolder1 = [NSEntityDescription insertNewObjectForEntityForName:@"Folder" inManagedObjectContext:context];
subFolder1.name = @"Folder 1 in root 1";
subFolder1.parent = root1;

root1.children = [NSSet setWithObjects: subFolder1, nil];

现在我想为每个文件夹创建一个ViewController,然后为每个子文件夹打开一个新的ViewController。 (或无限的UITabelView)

当我使用以下代码循环文件夹实体时:

NSArray *folders = [context executeFetchRequest:fetchRequest error:&error];
for(Folder *folder in folders){
   NSLog(@"Profile: %@", folder.name);
}

我立即获得了所有文件夹。

所以问题是:如何在树形结构中记录它?所以我可以先为所有根文件夹创建一个ViewController,然后为每个子文件夹创建另一个ViewController等等... (换句话说:我如何阅读这个实体,因为我将它放在UITabelView中)

1 个答案:

答案 0 :(得分:6)

您没有详细说明如何构建获取请求,但关键是使用NSPredicate过滤结果,以便在任何给定时间包含感兴趣的Folder个对象。为此,您需要在视图控制器中存储对当前父文件夹的引用:

@property (readwrite, strong) Folder *parentFolder;

如果您位于树的根部,则为nil,否则它将引用您正在显示其内容的当前文件夹。

然后在谓词中使用此属性:

NSFetchRequest *fetchRequest = ...
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"parent = %@", self.parentFolder];
[fetchRequest setPredicate:predicate];

当您位于根目录时,这将只选择Folder parentnil的实例(即只有根级别对象)。在每个其他级别,它仅选择Folders,其中parent是当前父文件夹的任何内容。

作为旁注,在示例代码中,没有必要设置subFolder1.parent root1.children。核心数据逆向关系管理意味着您只需要在关系的一侧执行此操作。它不会伤害到任何事情(除了非常小的性能影响),但它也没有用处。