[英]How do I filter nested CoreData entities with a date range and get the sum of nested relationship with a given attribute?
我正在开发一个 SwiftUI/CoreData 笔记应用程序,它允许用户在文件夹中组织笔记。 文件夹可以包含子文件夹或注释。 子文件夹还可以包含子子文件夹和注释等,深度没有限制。 这种方法类似于 iOS 文件夹应用程序。 当一个人完成它的工作时,一个笔记可以被标记为“完成”。 用户还可以在主视图中 select 日期范围以按日期过滤注释。 我已经构建了以下 model:
其中文件夹与文件夹具有一对多关系,与便笺具有一对多关系。 在我目前的方法中,我正在使用没有父级(因此是树的根节点)的所有文件夹的列表。 @State 变量amountOfDaysShown
保存当前选定的日期范围。
@FetchRequest(
entity: Folder.entity(),
sortDescriptors: [
NSSortDescriptor(keyPath: \Folder.title, ascending: true)
],
predicate: NSPredicate(format: "folder == nil"),
animation: .easeInOut
) var folders: FetchedResults<Folder>
...
List {
ForEach(self.folders, id: \.id) { folder in
NavigationLink(
destination:
FolderNotesView(
folder: folder,
amountOfDaysShown: $amountOfDaysShown
)
)
FolderNotesView
获取与传递给它的文件夹匹配的所有笔记,同时还按给定日期范围进行过滤:
self._folderNotes = FetchRequest<Note>(
entity: Note.entity(),
sortDescriptors: [],
predicate: NSCompoundPredicate(
type: .and,
subpredicates: [intervalPredicate, NSPredicate(format: "folder == %@", folder)]
)
)
在相应的视图中,我将当前文件夹的所有子文件夹作为 ViewBuilder 传递给笔记列表,因此在同一个列表中显示子文件夹和笔记:
NotesList(
notes: folderNotes,
amountOfDaysShown: $amountOfDaysShown
) {
FolderNotesView(
folder: folder.folders,
amountOfDaysShown: $amountOfDaysShown
)
}
这一切都按预期工作。 我在主视图上有一个所有父文件夹的列表。 选择一个后,应用程序会导航到该文件夹内的文件夹和注释列表。 现在我面临两个问题:
isDone == false
的笔记并在父文件夹上显示计数。目标应该是这样的:
其中红色数字是每个级别的音符总数,蓝色数字是所有具有isDone == false
的音符的计数。 Apple Notes 仅计算当前级别的注释,而我想递归计算整个文件夹树。
我尝试递归地总结 CoreDataProperties 中文件夹的所有注释。 这有效,但计数不能按日期过滤。
我一直在研究的另一个解决方案是按照教程构建一棵树。 我的目标是获取所有文件夹(据我了解,默认情况下关系是faulted
的,因此包含的注释是延迟加载的)。 然后,我将构建一个文件夹树及其相应的子文件夹等。然后我将获取日期范围内的所有笔记并将 map 提取到树中,同时汇总每个节点上isDone
笔记的计数和计数。 然后将树传递给视图,将总提取请求减少到只有两个。 在纸面上,这似乎是一个很好的方法,但它感觉非常hacky和非SwiftUI,我最终无法让它工作。
什么是显示嵌套 CoreData 关系计数同时按日期范围过滤的好方法?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.