【问题标题】:Core Data Directory (tree) Structure核心数据目录(树)结构
【发布时间】:2014-02-10 00:38:17
【问题描述】:

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

我要创建的是一个简单的目录结构。 (带有子文件夹的文件夹,带有子文件夹的文件夹,......以及后来的文件。)

我现在有这个文件夹实体:

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

// 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 中一样)

【问题讨论】:

  • 使用获取结果控制器,省去很多麻烦。在您的 viewController 中为父文件夹创建一个 ivar,将第一个 viewController(顶级)设置为 nil。当您在 tableView 中选择一个文件夹时,创建 viewController 的另一个实例并将其 ivar 设置为所选项目(父项)并将其推送到堆栈上。使用下面 Tom 描述的谓词。使用像你这样的数组意味着编辑不会自动反映在你的 UITableViews 中。观看视频,了解具有相同文件夹/文档结构且使用 Core Data 的应用程序。
  • 支持拖放等。您不会在网站上找到有关如何实现文件夹和文档层次结构的任何详细信息,但如果有任何兴趣,我可以添加一些详细信息。 ossh.com.au/design-and-technology/software-development/…
  • 真的很有帮助,谢谢!

标签: ios objective-c core-data treeview


【解决方案1】:

您没有详细说明获取请求是如何构造的,但关键是使用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。 Core Data 逆向关系管理意味着您只需要在关系的一侧执行此操作。两者都做并没有什么坏处(除了对性能的影响很小),但也没有任何用处。

【讨论】:

  • 感谢您的信息!像魅力一样工作:)
  • 如果我要将文件添加到这些文件夹中,通过添加一对多关系 Folder.files ->> File.inFolder 并且实体文件夹和文件都有一个名为“订单”的 int 属性如何我可以对文件和文件夹进行排序吗?
  • 查看NSSortDescriptor。此外,如果您的排序是按字母顺序排列的,则不需要 order 属性。
  • 谢谢,我需要定制订单。我在 NSSortDescriptor 上苦苦挣扎的原因是文件夹和文件在不同的实体中是 2 个,但顺序相同。
  • 当然,您不能执行涵盖多个实体的获取请求。一种选择是使用实体继承,以便两个实体都从同一个父级继承,并将 order 属性放在父级中。另一种方法是进行两次单独的提取并将两个结果数组合并为一个。
猜你喜欢
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
相关资源
最近更新 更多