我将文件夹结构存储在核心数据中。它反映了文件/文件夹的本地结构,并且只要用户在finder中执行任何操作(例如重命名/删除/创建),就需要更新DB。
我定义了单个实体节点(name,fullPath,type(dir / file))
从节点实体到其自身的 to-many 关系children
,删除规则设置为级联
从节点实体到其自身的到一个关系parent
,删除规则设置为null。
并将它们设置为彼此的反向关系。
用户重命名文件夹时遇到问题。目前我正在更新节点并添加了通过父路径和子名称构建完整路径的方法。
但有时我需要通过路径获取节点,重命名后文件节点不会更新。重命名后,我不想遍历文件夹内的所有文件。某个文件夹包含100k节点。
任何人都可以帮助我或建议我更好的设计吗?
答案 0 :(得分:1)
你已经创造了这个问题,现在你已经看到了它的影响。
无论您如何存储数据,您都创建了一种情况,即可能需要一次更新100k或更多节点上的字符串值。这是很多工作而且不容易优化,因为迟早你必须计算和更新所有这些字符串。
所以真正的问题是,为什么要在每个节点上存储完整路径,你能否设法停止这样做?
我不确定你为什么要这样做。对于每个节点,您可以通过递归跟随父关系来计算路径,直到到达根节点。同样,如果您有完整路径并且需要查找节点,则可以使用路径分隔符(可能是“/
”)将路径拆分为组件,然后通过子关系从根节点向下工作获取目标节点。
关于这一点的好处是,如果你在树的中间某处重命名一个节点,就是这样,你就完成了!无需更新任何其他节点。
将数据表示为trie而不是简单地命名每个节点并链接其子节点可能更好,但这需要在Core Data中具有一些创造性。我刚才描述过one possible approach,但我并不一定声称它是最好的。我不会尝试这个,除非你发现我上面描述的方法在实践中很慢。