考慮以下簡單的實體模型:實體A具有對一關係到實體B稱爲b。實體B具有稱爲a的相反關係。這兩種關係都不是可選的。關係完整性和驗證在覈心數據的iCloud同步處理
A B
b < ----- > a
假設我們有兩個設備(1)和(2)開始完全同步。每個都有一個A類對象和一個B類對象,並且它們相互關聯。在設備1上,我們有對象A1和B1,在設備B上我們有相同的邏輯對象A1和B1。
現在假設simulateous改變每個器件上製成:
在裝置1中,我們刪除B1,B2插入,和準A1與B2。然後 保存更改。
在設備2上,我們刪除B1,插入B3,並將A1 與B3關聯。然後保存更改。
設備1現在嘗試從設備2導入事務日誌.B3將被插入,並且A1將與B3關聯。到目前爲止這麼好,但B2現在剩下關係a等於零。 和的關係是非可選的,所以發生驗證錯誤。
類似的東西將發生在裝置2中,因爲有兩個B的物體,並且只有一個目的要與之關聯。必有從而始終是一個驗證錯誤,因爲乙對象中的一個必須具有一關係設定爲零。
更糟糕的是,任何未來的變化將永遠留下一個錯誤的對象B遊逛,因此將無法通過驗證。實際上,用戶不能通過重新設置關係來解決問題。它永久破碎。
問題是,你怎麼能解決這樣的驗證錯誤?這一切都發生在NSPersistentStoreDidImportUbiquitousContentChangesNotification
通知被觸發之前。這不是您的應用主NSManagedObjectContext
中的驗證錯誤,它是在將事務日誌初次導入持久性存儲過程中發生的驗證錯誤。
我能想到的唯一選擇可能是嘗試刪除B類本身上的自定義設置器(setA:
)或KVC驗證方法(validateA:error:
)中的無效B對象,因爲它們似乎是在事務日誌導入期間觸發。但我不確定這樣的副作用是否被允許,當我嘗試它時,它似乎會導致令人討厭的日誌消息。
任何人都知道正確的處理方法是什麼?
謝謝,這非常有用。開發論壇帖子似乎表明這只是一對多關係的問題,但我不認爲是這樣。它會在任何需要的關係被同時修改的情況下出現。無論如何,至少我知道這是一個框架中的錯誤,並且可以嘗試解決它。 – 2012-04-18 09:04:38
這個問題在6.x和10.8.x中是否仍然存在? – 2013-02-18 14:44:39
不幸的是,它仍然是iOS 6.1中的一個問題。 – thevoid 2013-02-18 18:45:22