2014-11-17 81 views
1

假設我有一個名爲Player的CoreData實體類型,並且它具有名爲PlayerPurpose的實體類型的一對一關係(purpose)。爲了完整性,假設我們在PlayerPurpose中有一個反比關係,稱爲parentPlayer。請看下面的SWIFT代碼:iOS中的孤兒對象CoreData

// Assume we already have a player object in a NSManagedObjectContext called context: 
player.purpose = NSEntityDescription.insertNewObjectForEntityForName("PlayerPurpose", 
       inManagedObjectContext: context) as PlayerPurpose; 

// Later in the code, we set the value to nil (or we could have replaced 
// it with another call to insertNewObjectForEntityForName) 
player.purpose = nil; 
// What happens to the previous playerPurpose object within the Managed Object Context? 

我的問題:發生什麼事到原來playerPurpose對象時,它在數據的唯一參考值設爲零(或與其他物體代替)託管對象內部?

這與關係刪除規則沒有什麼關係,因爲我沒有明確刪除任何對象 - 我將它從任何有意義的關係中刪除,使其成爲孤兒。

從ARC的角度來看(如果PlayerPurpose只是一個普通的非託管對象),原始的PlayerPurpose實例現在沒有引用,所以它可以從內存中清除 - 但是託管對象上下文會發生什麼? CoreData會將此識別爲孤立對象並通過上下文將其刪除嗎?

如果不是,那麼我假設我必須小心刪除通過上下文創建的任何託管對象,如果我要擺脫對它的所有引用。假設情況是這樣,是否有一個好的模式用於確保孤立的對象從NSManagedObjectContext中清除,並且它們不再存儲在持久性存儲中?

謝謝!

回答

4

核心數據不會自動刪除此場景中的對象,因爲「孤立」是您的代碼具有但核心數據不能識別的概念。沒有理由刪除PlayerPurpose對象,因爲它的一個關係是零。

最可靠的方法,以確保PlayerPurpose情況下被刪除。將

  1. 您的實體創建自定義NSManagedObject子類(如果沒有他們的話)。
  2. 覆蓋Player子類上的設置方法purpose。如果新值爲零,請刪除舊值。

您也可以通過確保在適當的時間致電deleteObject:來處理此問題。或者你可以運行一個清理步驟,在該步驟中你可以爲parentPlayer提取一個無零值的PlayerPurpose並刪除它們。

+0

感謝您的回答。它證實了我的懷疑。 – FTLPhysicsGuy