將新的Core Data模型版本添加到我的應用後,我執行了輕量級遷移,顯然已成功完成。遷移後的文件加載正常,但在第一次嘗試通過特定關係訪問屬性時,該應用程序崩潰,出現NSRangeException: '*** -[__NSArrayM objectAtIndex:]: index 4294967295 beyond bounds [0 .. 35]'
。這種關係在遷移之前運行良好。我從其他帖子瞭解到,4294967295確實是-1
,但我可以在我的應用/數據中識別出36個項目的唯一情況是數據模型中有36個實體(作爲參考,正在獲取的關係有58個項目在其表格中)。核心數據遷移後的NSRangeException
問題:
我的問題是:根據我得到的錯誤,我已經做了以下的故障排除,有沒有一種模式的變化,可以通過輕量級遷移,但腐敗一路上的數據,導致着名的例外?我將嘗試將幾個版本的遷移劃分爲更小的塊,以便隔離或避免該問題,但能夠專注於可能存在錯誤的特定模式更改會很好。
失敗:
用下面的代碼中的「爲MyObject」時發生該故障:
[[self object2] text];
的Object2的關係是一對一,非可選兩種方式和既不向前也不數據模型之間反比關係發生了變化。 text
屬性可能不相關,因爲發生錯誤時,awakeFromFetch
未在object2中到達。如果在上述語句之前將[self object2]
分配給變量,則分配成功並報告data: <fault>
。
數據庫:
在sqlite3的數據庫來看,我注意到以下幾點:
- 正向和反向關係的指數值似乎是在每個表是正確的。
- object2表具有兩個反向關係列,而不是遷移前的列(前
ZMYOBJECT
和其他Z2_MYOBJECT
,對於所有行都爲空)。沒有其他關係被添加來解釋這一欄。 - 在
Z_PRIMARYKEY
表中,遷移後的所有條目顯示-1
爲Z_MAX
,而在遷移之前,它們對於空表顯示爲零,對於已填充的表顯示爲最大行數。手動更新Z_MAX
到合適的值沒有幫助例外。所有Z_SUPER
值都是正確的。
我設置了一個映射模型來查看是否有任何東西看起來與自動映射有關,但一切看起來都很好。
總體架構更改:
在數據模型的源代碼版本,有共有十四實體,其中只有四個已經填充了數據(應用程序仍處於開發階段)。 7個是頂級實體,7個是三個頂級實體的子實體。
在目標版本的數據模型中,添加了22個實體,一些頂級實體和一些子實體,有幾十個關係,其中一些添加到現有實體中。
某些屬性和關係已從現有實體中刪除,而其他屬性已添加。沒有更改數據類型或關係設置,沒有重命名屬性或關係,也不需要特殊映射。
更新(2/25/12):當我開始研究一個新的中間模型時,我記得我已經將一些實體的類從NSManagedObject更改爲NSManagedObject子類,但是沒有生成類文件。我沒有懷疑這會導致問題,並且實際上,創建所有類文件對異常沒有幫助。我只是想指出,作爲模型之間的另一個變化。
結論:
這是胡亂猜測,但如果36單位數是不是巧合,似乎在「爲MyObject」試圖在「對象2」故障它沒有一個有效的參考對於表並且試圖加載表號-1,導致異常。然而,簡單的[self object2]
賦值成功的事實並不符合該結論。
任何想法?
你是如何選擇你的映射模型的?關閉自動遷移後? – 2013-07-03 09:12:58
@JoãoNunes一旦禁用了自動遷移,只要源和目標散列匹配,它就會自動選擇您的映射模型。只要您在創建映射模型後尚未修改數據模型,它們就應該匹配。不幸的是,有時他們不這樣做,正如這裏所說:(http://stackoverflow.com/questions/10894383/core-data-mapping-model-version-hashes-not-matching-to-source-model-version-hash )。打開核心數據遷移調試模式可以幫助解決未選擇映射模型的問題。 – 2013-07-03 15:56:28
感謝您的提示。我爲遷移添加了調試,但仍然存在問題。我在這裏創建了一個問題:http://stackoverflow.com/questions/17464414/core-data-mapping-model-not-working-with-correct-hashes – 2013-07-04 07:50:55