Ios CoreData中的递归获取
我将数据结构简化为: 因此,一个文件夹可以包含多个文件夹或代码段,而每个代码段都是文件夹的一部分。 我想获取给定文件夹中的所有代码片段,或者获取特定文件夹的子文件夹中的所有代码片段 第一个案例对我来说很有效,但我在正确处理第二个案例时遇到了问题 为了更清楚地说明这一点,以下是一个示例: 当我选择文件夹C时,我希望得到代码段3,但当我选择文件夹B或文件夹A时,我希望得到代码段1、代码段2和代码段3 这就是我目前拥有的:Ios CoreData中的递归获取,ios,swift,core-data,Ios,Swift,Core Data,我将数据结构简化为: 因此,一个文件夹可以包含多个文件夹或代码段,而每个代码段都是文件夹的一部分。 我想获取给定文件夹中的所有代码片段,或者获取特定文件夹的子文件夹中的所有代码片段 第一个案例对我来说很有效,但我在正确处理第二个案例时遇到了问题 为了更清楚地说明这一点,以下是一个示例: 当我选择文件夹C时,我希望得到代码段3,但当我选择文件夹B或文件夹A时,我希望得到代码段1、代码段2和代码段3 这就是我目前拥有的: class Store { ... func snippetsFe
class Store {
...
func snippetsFetchRequest() -> NSFetchRequest<Snippet> {
let fetch: NSFetchRequest<Snippet> = Snippet.fetchRequest()
fetch.returnsObjectsAsFaults = false
fetch.relationshipKeyPathsForPrefetching = ["folder", "tags"]
fetch.sortDescriptors = [NSSortDescriptor(key: "updateDate", ascending: false)]
return fetch
}
...
}
let context = PersistenceManager.shared.mainContext
let store = SnippetStore(context: context)
fetchedResultsController = NSFetchedResultsController(fetchRequest: store.snippetsFetchRequest(),
managedObjectContext: context,
sectionNameKeyPath: nil,
cacheName: nil)
fetchedResultsController.fetchRequest.predicate = NSPredicate(format: "folder == %@", selectedFolder)
do {
try fetchedResultsController.performFetch()
} catch {
...
}
类存储{
...
func snippetsFetchRequest()->NSFetchRequest{
let fetch:NSFetchRequest=Snippet.fetchRequest()
fetch.returnsObjectsAsFaults=false
fetch.relationshipkypathsforprefetching=[“文件夹”,“标记”]
fetch.sortDescriptors=[NSSortDescriptor(键:“updateDate”,升序:false)]
回传
}
...
}
让context=PersistenceManager.shared.mainContext
let store=SnippetStore(上下文:context)
fetchedResultsController=NSFetchedResultsController(fetchRequest:store.snippetsFetchRequest(),
managedObjectContext:context,
sectionNameKeyPath:nil,
缓存名称:nil)
fetchedResultsController.fetchRequest.predicate=NSPredicate(格式:“文件夹==%@”,selectedFolder)
做{
请尝试fetchedResultsController.performFetch()
}抓住{
...
}
但这只获取作为给定/选定文件夹的直接子级的代码段
是否有任何方法可以通过仍然使用NSFetchedResultsController解决我的问题?您的数据结构错误。人们倾向于认为数据结构器对给定的信息有一个“正确的”;你要尽可能地“模拟”现实。这是错误的。您的模型只有在为您的特定应用程序提供价值时才有价值
在这种情况下,如果要获取文件夹的所有死者,最好建立一个表示该死者的关系。您可以建立死者和祖先的多对多关系,可以在添加对象时设置这些关系。如果需要更多属性进行筛选或排序,则应该添加它们,即使这些属性理论上可以从当前树模型派生。只需确保它们保持同步。这看起来有点像复合设计模式,您可以在代码中通过使用一个方法
allSnippets
来解决这个问题,该方法获取snippets
,并将其与对所有子对象调用allSnippets
的结果合并。是的,我也这么认为。我想我可以通过获取所有代码片段,然后应用一些过滤逻辑,分别遍历子代码来解决这个问题。然而,我问自己NSPredicates是否有一些内置功能。NSFetchedResultsController,或者通过更新我可以使用的底层模型体系结构,而不是删除我的FetchedResultsController并自己实现逻辑。我现在明白了,我忘了说所有片段
应该是文件夹中的一个方法。当然,我已经在文件夹上建立了代码片段关系,我可以利用它。我想,如果没有聪明的方法来表达这种请求,这将是一种方式。