6

我的核心數據有問題。隨着Swift3 iOS中10我一次比一次,我獲取或一對一關係不可接受的值類型:property =「user」;所需的類型=用戶;給定類型=用戶;

func getContext() -> NSManagedObjectContext { 
    let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    return appDelegate.persistentContainer.viewContext 
} 

在我的應用程序存儲數據的管理對象方面,我有兩個實體「用戶」和「總帳」。我想爲用戶分配分類帳,但用戶可以有多個分類賬。因此,我有一個UserTableView,我可以在其中顯示用戶和UserViewController類,並在其中創建用戶。我擁有的賬本也一樣。在創建分類帳時,我還列出了所有用戶,我從中選擇一個分配給分類帳的用戶,反之亦然。

當保存像前面提到的,我得到的錯誤

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unacceptable type of value for to-one relationship: property = "user"; desired type = User; given type = User; 

我的數據模型如下所示: Data Model

任何幫助,高度讚賞:)

+1

你解決這個問題? – Voltron

回答

0

我有同樣的問題。對我而言,這是在我進行單元測試時發生的。在這種情況下,一次在內存中有兩個核心數據堆棧,一個用於應用程序線束,另一個用於運行單元測試。

解決此問題的第一條線索是在設置關係屬性之前放置一個斷言,以確保我設置的對象的實體類型與該關係的預期實體類型相同。它們應該是相同的,在我的情況下它們不是。

在我的情況下,我有一個MatchRequestPlayer有一個一對一的關係,稱爲「發起人」。所以,我的說法看起來像以下:

let player = try Player.findLocal(for: matchRequest.initiator, in: moc, createIfMissing: true) 
    let expectedEntity = self.entity.relationshipsByName["initiator"]!.destinationEntity! 
    assert(player!.entity === expectedEntity, "Player returned doesn't have the same entity type") 
    self.initiator = player 

上述斷言失敗了,我懷疑是類似於核心數據使用的說法,導致參數異常。

當檢查Player.entity()時,它將返回導致失敗的相同實體實例。

我認爲問題的根源在於核心數據爲實體設置了一些靜態屬性,這些屬性會在覈心數據堆棧之間錯誤地共享。調用MyManagedObject.entity()將從一個堆棧調用時正常工作,但不從另一個堆棧調用。

因此,要解決這個問題,當我創建我的Player對象以放入關係時,我得到的實體使用的是較舊的NSEntityDescription.insertNewObject(...) API,而不是較新的MyManagedObject(context:)構造函數。這可確保爲給定的託管對象上下文使用正確的實體。

因此,回顧一下:

// SOMETIMES FAILS if you have more than one core data stack: 
result = Player(context: managedObjectContext) 

// ALWAYS WORKS: 
result = NSEntityDescription.insertNewObject(forEntityName: "Player", into: managedObjectContext) as? Player 
相關問題