簡體   English   中英

CoreData 中的遞歸獲取

[英]Recursive fetch in CoreData

我有一個簡化的數據結構:

數據結構

所以一個文件夾可以包含多個文件夾或片段,每個片段都是一個文件夾的一部分。 我想獲取給定文件夾中或特定文件夾的子文件夾中的所有片段。

第一種情況對我有用,但我無法正確處理第二種情況。

為了使這一點更清楚,這里有一個例子:

例子

當我選擇文件夾 C 時,我想要獲取代碼片段 3,但是當我選擇文件夾 B 或文件夾 A 時,我想要獲取代碼片段 1、代碼片段 2 和代碼片段 3。

這就是我目前擁有的:

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 {
    ...
}

但這只會獲取給定/選定文件夾的直接子級的片段。

有什么方法可以通過仍然使用NSFetchedResultsController來解決我的問題嗎?

你的數據結構是錯誤的。 人們傾向於將數據結構視為給定信息的“正確”形式; 您想要盡可能接近現實“建模”。 這是錯誤的。 您的模型只有在為您的特定應用程序提供價值的情況下才有價值。

在這種情況下,如果您想獲取一個文件夾的所有后代,最好建立一個關系來表示它。 您可以在添加對象時設置后代和祖先的多對多關系。 如果您需要更多屬性來過濾或排序,您應該添加它們,即使這些屬性在理論上可以從當前的樹模型中派生出來。 只要確保它們全部保持同步即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM