【问题标题】:Folder structure in core data核心数据中的文件夹结构
【发布时间】:2018-07-28 00:34:40
【问题描述】:

我将文件夹结构存储在核心数据中。它反映文件/文件夹的本地结构,并且每当用户在查找器中执行任何操作(例如重命名/删除/创建)时都需要更新数据库。

我已经定义了单个实体节点(名称、完整路径、类型(目录/文件))。
从节点实体到自身的对多关系children,删除规则设置为级联
从节点实体到自身的一对一关系parent,删除规则设置为无效。
并将它们设置为彼此的反向关系。

我在用户重命名文件夹时遇到问题。目前我正在更新节点并添加了通过父路径和子名称构造完整路径的方法。

但有时我需要通过路径获取节点,重命名后文件节点不会更新。我不想在重命名后遍历文件夹内的所有文件。一些文件夹包含 100k 个节点。

谁能帮助我或建议我更好的设计?

【问题讨论】:

  • 为什么要在每个节点上存储完整路径?
  • @TomHarrington 这是旧代码。我们有所有文件/文件夹的平面结构。现在我已经添加了父子关系,但是当用户重命名文件夹时我仍然面临同样的问题。

标签: ios macos sqlite core-data


【解决方案1】:

你已经创建了这个问题,现在你看到了它的影响。

  • 您将完整路径存储在每个节点上
  • 您的节点包含 100k 或更多子节点
  • 您希望能够重命名路径的任意部分

无论您如何存储数据,您都可能需要一次更新 100k 或更多节点上的字符串值。工作量很大,而且不容易优化,因为迟早您必须计算和更新所有这些字符串。

所以真正的问题是,你为什么要在每个节点上存储完整路径并且你能设法停止这样做吗?

我不确定你为什么要这么做。对于每个节点,您可以通过递归地遵循父关系直到到达根节点来计算路径。同样,如果您有完整路径并且需要查找节点,则可以使用路径分隔符(可能是“/”)将路径拆分为组件,然后通过子关系从根节点向下工作以获取目标节点。

这样做的好处是,如果你在树中间的某个地方重命名一个节点,就是这样,你就完成了!无需更新任何其他节点。

最好将数据表示为trie,而不是简单地命名每个节点并链接其子节点,但这需要Core Data 中的一些创造力。不久前我描述了one possible approach,但我不一定声称它是最好的。我不会尝试这个,除非你发现我上面描述的方法在实践中很慢。

【讨论】:

  • 我只能存储节点名称,但如果父节点有 10k 个节点,则使用完整路径获取节点将花费更多时间。我需要检查节点,直到我得到匹配的子节点并为子节点重复相同的步骤。
  • 我明白这一点。如果你使用这种结构,你的需求将需要做很多工作,这就是为什么我提到了 trie 的想法。不过,我会先尝试上述方法,因为虽然 10k 听起来很多,但这并不一定意味着它对您的应用来说太慢了。
  • 获得完整路径时的另一种解决方案。使用路径分隔符将路径拆分为组件,然后获取具有匹配名称的所有节点并通过比较关系删除虚假节点。
  • @ParagBafna 好主意!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
  • 2019-03-26
相关资源
最近更新 更多