我有一個CoreData數據庫,其中包含大約500.000個郵票和86.000系列。我必須從使用JSON的web API下載它們。將核心數據加入郵票和系列沒有任何問題。但是在兩者之間建立關係時我遇到了麻煩。將大數據集導入核心數據,在Swift中建立關係
每張郵票有一個系列,每個系列可以有多個郵票。正如上面我的數據模型的圖片所示。
我需要使兩者之間的關係高效快速。
建立 新導入的對象之間的關係時,類似的問題經常發生:當我在做一些研究,我碰到這個網站https://www.objc.io/issues/4-core-data/importing-large-data-sets-into-core-data/我最感興趣的部分跌跌撞撞。使用獲取請求獨立獲取每個相關對象是非常低效的。有兩種可能的解決方法:要麼我們先解決類似 的批處理與我們如何首先導入對象的關係,要麼緩存已導入對象的對象標識 。通過解析 批處理中的關係,我們可以大大減少一次獲取許多相關對象所需的提取請求數量 。不要擔心 可能長時間謂詞,如:
[NSPredicate predicateWithFormat:@"identifier IN %@", identifiersOfRelatedObjects];
解決謂語用在IN(...)許多標識符子句 總是這樣比去磁盤更高效各自獨立地反對 。但是,還有一種方法可以避免獲取請求 (至少如果您只需要在新導入的對象之間建立關係 )。如果緩存所有導入對象(在大多數情況下不是很多數據)中的對象ID,則可以稍後使用它們使用 objectWithID:來檢索相關對象的錯誤。
// after a batch of objects has been imported and saved for (MyManagedObject *object in importedObjects) { objectIDCache[object.identifier] = object.objectID; } // ... later during resolving relationships NSManagedObjectID objectID = objectIDCache[object.foreignKey]; MyManagedObject *relatedObject = [context objectWithID:objectId]; object.toOneRelation = relatedObject;
注意,這個例子假定標識符屬性是所有實體類型獨特 ,否則我們將不得不考慮針對不同類型的,我們緩存 對象ID的方式 重複的標識符。
但我不知道他們是什麼意思,有人可以給一些更多的解釋。最好在Swift中,因爲這是我理解最好的語言,也是我創建我的應用程序的語言。 當然其他建議也很好。 注意,離開CoreData不再是一種選擇。