2

我在Mac OS X 10.5上使用Core Data時遇到了一個令人討厭的錯誤。核心數據遷移驗證錯誤

所有的實體在我的應用程序中有共享相同名稱的類。

到目前爲止,我已經完成了5次遷移,沒有任何問題。

我正在使用XML數據存儲。 我有13個實體的V5數據模型,其中4個是抽象的。它看起來像這樣: alt text http://synapticmishap.co.uk/ObjectModel.jpg

我做什麼

  1. 創建我的數據的新版本 模型 - 這是V6。

  2. 添加一個新的實體(JGToolbarWindow) 並將父項設置爲JGWindowBase。

  3. 添加了從 V5到V6的映射模型。保存它。

  4. 將當前版本設置爲V6。

  5. 構建和調試。

我已經在Persistent Store Coordinator選項字典中打開了自動遷移。

的問題

  1. 得到一個錯誤 - 「多重驗證發生 錯誤。」

  2. 我設置了一個斷點並檢查了 驗證錯誤。有很長的 驗證錯誤列表 - 那裏 似乎是每個數據項的一個。

  3. 看來,它剝離了所有 的關係,因爲我的 屬性之一 - 應用 - 設置爲 需要,這算作一個 驗證錯誤。

  4. 如此看來,問題在於不能夠遷移 的關係......即使 明顯沒有已遠 的關係去改 遷移。

  5. 當我看到在〜/庫/應用程序支持 /我的應用程序的名稱/我看到那種有由.xml.new附加當 這個文件將在文本尋找同名 一個XML 數據存儲編輯,所有 關係確實已被剝離出 。

我已經試過

  1. 創建一個新的XML數據存儲和 把幾件作品在裏面,然後 重試。我爲每個項目獲得相同的 錯誤。

  2. 清潔和重建。

  3. 確保舊的.xml.new從 以前的驗證已被刪除,其中 已刪除。

  4. 刪除新的模型版本和 重複我的行動,以確保我 沒有搞砸了。

  5. 爲 中的每個 添加映射條目,默認情況下會忽略抽象類 。添加了所有 屬性和關係。還是 完全一樣的錯誤。

  6. 嘗試添加具有 JGWindowBase作爲父項的新實體 沒有一類,只是根據 NSManagedObject。再次, 失敗。

我能想到的唯一改變的是我在模型的基礎類中的一些內部邏輯。但這些都是微小的變化,我無法理解它是如何遷移的好,現在不是什麼都沒有改變。

我試過了一個全新的從最新的數據存儲遷移過來的遷移,並且有完全相同的問題。這意味着我必須解決這個問題,任何數據遷移工作。

錯誤

當我把一個斷點在presentError線以下

if (![persistentStoreCoordinator addPersistentStoreWithType:NSXMLStoreType 
                configuration:nil 
                  URL:url 
                 options:options 
                  error:&error]){ 
      [[NSApplication sharedApplication] presentError:error]; 
} 

並檢查錯誤用戶信息,我得到很多的錯誤是這樣的:

Error Domain=NSCocoaErrorDomain Code=1570 UserInfo=0x67ebfd0 "item is a required value." 

po (NSArray *)0x67ebfd0

給出:

NSLocalizedDescription = "item is a required value."; 
NSValidationErrorKey = item; 
NSValidationErrorObject = <NSManagedObject: 0x45d5830> (entity: JGLogEntry; id: 0x4baccb0 <x-coredata://B597E13E-BE74-402E-BF00-5E1D57898406/JGLogEntry/p13942> ; data: { 
duration = nil; 
item = nil;     // <<< Here's the problem. 
processBundleID = nil; 
processID = nil; 
processName = nil; 
startTime = 2009-10-09 16:41:44 +0100; 
stopTime = 2009-10-09 16:42:17 +0100; 
windowDocumentPathOrURL = nil; 
windowID = nil; 
windowTitle = nil; 

這一切真的告訴我的是,它刪除連接到項目的關係,這是一個必需的屬性,它就是爲什麼它告訴我有驗證錯誤。應用程序也有整個負載,這是另一個必需的屬性。

正如我所看到的那樣,問題不在於驗證錯誤,因爲它似乎不會遷移任何關係在所有

我把我的頭髮拉出來。我真的很感激一些幫助。最後,星球大戰報價:

「幫幫我,堆棧溢出。你是我的 唯一的希望。」

+0

你真的能向我們展示一個驗證錯誤的例子嗎? – 2009-10-13 19:42:49

+0

我的回憶是,涉及抽象基礎關係的映射很困難。確切的錯誤可能有助於指向正確的方向。 – 2009-10-13 19:43:48

+0

感謝評論,巴里。我發佈了一些錯誤的東西。我只是不明白我如何能夠成功地遷移抽象基類的2/3倍,但沒有改變任何東西,它突然間就會對我產生影響。 – 2009-10-13 22:39:27

回答

0

升級雪豹

雪豹似乎爲解決這個問題 - 我已經沒有用,因爲升級遷移數據的任何問題。

另外,我想它可能會消失,因爲我切換到SQLite數據存儲,儘管我認爲更有可能在Leopard上使用抽象對象進行遷移有點破碎。

+1

你也可以嘗試添加一個版本哈希修飾符到你的抽象實體中以便遷移。我在過去發現如果模型不夠多,你會得到這個效果。它在實體編輯器中的該扳手選項卡下 – 2011-03-04 21:50:33