2015-11-04 46 views
9

我在覈心數據中看到了很多有關批量刪除的問題,但似乎沒有一個能解決我的問題。核心數據NSBatchDeleteRequest似乎在上下文中留下對象

我正在使用Core Data創建iOS 9/Swift應用程序。在今年的WWDC上,我參加了Core Data會議,看到我可以使用NSBatchDeleteRequest直接從持久存儲區中刪除大量對象。這對我而言適用於某些對象,但不適用於其他對象,我認爲這與我的關係有關。

我具有由SubjectCourse,那裏有一對多的關係的對象圖。受試者可以擁有任意數量的課程。

有一個「課程」上SubjectCascade刪除規則的關係,因爲我想用一個subject相關聯的所有課程時,一個subject被刪除到被刪除。

Course上的反例是'subject',其刪除規則爲Nullify。在這裏,我有點困惑,因爲蘋果的描述Nullify

刪除對象之間的關係,但不刪除任何對象。 這隻有在員工的部門關係是可選的,或者確保在下一次保存操作之前爲每位員工設置新部門時纔有意義。

這使得它很清楚,但爲什麼要刪除關係但不是兩個對象?如果我刪除Course,我想Course被刪除,而從subjectcourse的關係被刪除,這樣的故障已刪除的Course不會在NSSetSubjectcourses集出現。

我想提供一種方法來刪除實體中的所有對象。當我嘗試通過單獨提取和刪除coursecourses被正確刪除並從NSSetcoursesSubject中刪除。

因爲我不知道有多少courses會出現,我想確保在任何情況下的高性能,我想我會使用批量刪除來刪除所有courses。問題是,雖然利用NSBatchDeleteRequest刪除所有Subjects工作正常,沿途刪除所有courses(由於Cascade規則),嘗試刪除所有Courses使用此方法似乎留下所有對象的位置。

我以前NSBatchDeleteRequest刪除所有Courses,但後來當我查詢MOC看什麼SubjectsCourses依然存在,仍返回兩個CoursesSubject擁有他們仍然對它們的引用。

相反,當我取,並分別刪除每個Course,我後來取正常顯示所有Courses並在Subject的「課程」的關係似乎已經適當修改一個空數組。

是的,我在執行請求後保存上下文。我想上下文可能不會通知商店做什麼,但然後再次刪除所有subjects工作得很好。這裏發生了什麼?

+0

批刪除無視刪除規則。 https://stackoverflow.com/questions/32915874/can-i-use-nsbatchdeleterequest-on-entities-with-relationships-that-have-delete-r/46073965#46073965 – LShi

回答

24

the WWDC 2015 session which describes NSBatchDeleteRequest有人解釋說「更改不反映在上下文」。所以你看到的是正常的。批量更新直接在持久存儲文件上工作,而不是通過託管對象上下文,因此上下文不知道它們。當你通過抓取和刪除來刪除對象時,你正在處理上下文,所以它知道你正在做出的改變(實際上它正在爲你執行這些改變)。

如果您使用NSBatchDeleteResultTypeObjectIDs,則可以使用mergeChangesFromRemoteContextSave:intoContexts:將批量刪除的結果合併回您的上下文中以更新您的上下文。如果您沒有從上下文加載任何其他託管對象,那麼也可以使用reset

+0

謝謝!我用重置,它的工作。在看到您的答案之前,我確實發現SQLite數據庫中缺少課程,應用程序在重新啓動時反映了這一點。 –

+0

我想切換到mergeChanges方法的安全。我有一個批處理刪除結果的副本,我已將其設置爲「NSBatchDeleteResultTypeObjectID」。我在'mergeChangesFromRemoteContextSave'上爲'changeNotificationData:[NSObject:AnyObject]傳遞了什麼? –

+0

好吧,而不是使用'NSBatchDeleteResultTypeObjectID',我註冊了'NSManagedObjectContextDidSaveNotification',並從塊中調用'mergeChangesFromRemoteContextSave'。 –

2

我最終在批量刪除後添加了以下內容來處理上下文。

[self.managedObjectContext refreshAllObjects]; 
相關問題