2014-06-26 37 views
2

我試圖在應用程序的核心數據中設置一些輕量級遷移測試,但遇到了一些奇怪的問題。將核心數據輕量級遷移到添加了新屬性的版本後,該屬性爲零

在我的應用程序的版本2和版本3模型之間,我剛剛添加了一個新的integer32屬性。該屬性的默認設置爲0(默認情況下,Xcode創建每當您創建一個新的屬性。我試着測試這個問題與新的屬性設置爲可選或不,它沒有任何區別。使用Xcode的自動生成我的NSManagedObject子類,包含我已經添加了新的屬性。

我使用UIManagedDocument加載我的核心數據文件,並設置它執行自動遷移

NSDictionary *docOptions = @{ 
         NSMigratePersistentStoresAutomaticallyOption : @YES, 
         NSInferMappingModelAutomaticallyOption : @YES 
         }; 
self.document.persistentStoreOptions = docOptions; 

我將當前文檔設置爲版本2的一組實時數據,然後將該應用更改爲版本3.我運行它並且文檔成功打開,因此我認爲遷移已正確運行。當它失敗時,不知道如何從中獲得任何錯誤,我的日誌中沒有任何錯誤。

有一次,我嘗試實際訪問我的NSManagedObject子類的新屬性的NSNumber的財產,我增加我只是發現,屬性是零的CoreData實體的實例,而不是默認的一個NSNumber 0

所有我可以在這裏找到的教程,文檔和問題似乎並不是說我必須做其他任何事情才能實現這一目標。

如果我乾淨地使用版本3模型並使用該版本創建新實體,那麼正如您所期望的那樣,新屬性不是零,因此一切正常。它只是遷移到這個新版本,它似乎沒有適當地在現有的實體實例內創建新的屬性。

任何人的幫助將不勝感激!乾杯。

回答

4

這其實很簡單,但可能有點不直觀。

您將此新屬性值視爲'nil'的原因是因爲您很可能已將其定義爲'可選'屬性。這意味着它可以被設置爲nil,所以CoreData不會在遷移期間填充它。

默認值只有在向數據庫插入新實體時纔有意義。

我看到一些可能的解決方案:

  • 定義這個新屬性爲非可選(簡單幹淨)。

或者 - 如果你真的需要保留這個屬性爲可選(壽,根據您的問題,我懷疑是這種情況,此外,這是不是一個真正的乾淨的解決方案):

  • 執行「內容遷移「就是這樣的:
    • 當您從版本2遷移到版本3時(您可以使用存儲元數據來追蹤/保留當前的內容」版本「號碼)時檢測。
    • 查詢所有現有條目,並根據需要填充數據。

或者:

  • 使用更先進的遷移機制比輕量級遷移。
+0

非常感謝這個答案。實際上,我終於在一天左右的時間裏發現了類似的發現,但之後一直未能上網。 我已經將這個新屬性添加到2個實體中,當我測試它是否可選時,我在代碼中尚未使用的1實體上這樣做。 所以是的,正如你所解釋的那樣,它是可選的,當然總的來說它是零。將其更改爲不可選,並重新遷移一切都非常好,新值設置爲默認值,如您所期望的那樣。 – jimbobuk

+1

我很高興我花了時間處理JSON導入/導出我的核心數據實體。這使得在覈心數據模型版本之間跳轉並重復執行遷移變得相對簡單。無法想象沒有這麼容易的測試,當你試着回滾一個版本時,很容易讓你的模型不想加載。 – jimbobuk

相關問題