2011-08-16 49 views
0

我有一個單身屬性(作爲managedObject)。該屬性中的對象可能會被更新(刪除,然後用自定義Id創建新對象,與舊對象的ID相同),然後保存上下文,取消屬性,獲取新對象並將其分配給屬性。CoreData。成功保存無效對象

我沒有錯誤,一切正常。重新啓動應用程序後,我得到「CoreData無法完成故障」異常。我通過sqliteBrowser打開了我的數據庫,並在那裏看到一箇舊對象和新對象。新對象是正確的。舊對象(應刪除的內容)與已刪除的對象有關係。

另外,當不同的線程更新對象時,UI可以訪問managedObject的屬性。

它是如何發生的?以及如何防止這種情況?我閱讀coreData疑難解答「CoreData無法履行故障」。自從例子以來我沒有發現我的問題。

我對此很困惑。我有想法,但不知道,它是什麼好方法: 如果使屬性不是作爲managedObject,但作爲ID(自定義ID,作爲NSNumber),owerload設置和getter。 Setter收到相同的對象,但可以訪問自定義ID併爲屬性分配一個ID。 Getter - 通過id獲取對象,保存在屬性中。 Getter和setter會在啓動時鎖定NSLock並在結束時解鎖。更新對象的線程也會鎖定鎖,直到更新和保存完成。 非常感謝!

P.S. 我很抱歉,但我通常不能以嚴肅的理由顯示我的代碼。

回答

1

將設置爲託管對象的類的屬性取消不會從上下文或存儲中刪除託管對象,因爲它們都保留與任何其他保留無關的託管對象。該對象將繼續存在於內存和存儲中,並將保持您爲其設置的任何關係,直到上下文刪除該對象。

發生「無法完成錯誤」錯誤,因爲oldObject的關係指向您已刪除的其他對象。這是由不正確的數據模型配置造成的,該配置在目標對象被刪除時不會中斷關係。檢查你的刪除規則。必須設置爲No Action

要實際刪除oldObject您必須告訴上下文的東西,如明確地將其刪除:

[myManagedObjectContext deleteObject:oldObject]; 

...或使用cascade刪除規則設置的其他實體的關係將其刪除。

+0

但我真的通過上下文刪除對象,並檢查所有刪除規則,並確信所有規則分配給「級聯」或「取消」。 – Arsynth

+0

刪除後是否保存了上下文?在保存上下文之前,商店不會更改。 – TechZen

+0

是的,我做到了。而老對象,還有活斷層存在與刪除圖有關係。它不經常發生,而不是所有的時間,使用相同的用戶操作 – Arsynth