2014-04-04 65 views
3

我已經處理過輕量級遷移以及映射基本更改,但是我已經搜索並溢出並且沒有找到類似的情況,其中實體名稱保持不變,但屬性類型從int更改爲字符串(我認爲這將很容易完成)將核心數據屬性類型從Integer32更改爲字符串

我以爲我是通過繼承NSEntityMigrationPolicy在正確的軌道上,然後我將mappingmodel中的自定義策略字段設置爲this子類(它甚至沒有一個Xcode重啓後自動完成...)

enter image description here

但我看到createDestinationInstancesForSourceInstance是沒有得到所謂的 enter image description here

現在,因爲我處理的自定義映射模型和政策,我應該還是有它推斷映射模型,但具有自動遷移掉在持久存儲?

NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption:@NO, 
          NSInferMappingModelAutomaticallyOption:@YES}; 

任何幫助,非常感謝!

我的屬性映射表情真的很希望我能夠做到像$ source.incrementer.string :)

Current Mapping

回答

3

首先,你嘗試一個輕量級的遷移,看看它會解決這個問題?就SQLite而言,它並不真正關心你是否將int改爲varchar,並且應該能夠無痛地做到這一點。

就您的映射模型而言,當核心數據找到該遷移的映射模型時,持久性存儲中的選項將自動被覆蓋。因此,您不需要關閉這些選項。

對於重量級遷移,您需要實施幾種生命週期方法才能使其正常工作,但實施-createDestinationInstancesForSourceInstance...可能不足以讓該類正確識別和使用。我會建議使用斷點存儲所有的方法,並按照哪些方法被調用。我在一段時間內沒有做過沉重的遷移,所以我記憶中的需要哪些方法是朦朧的。

話雖如此,爲此進行大量遷移是解決此問題的非常昂貴的方法。雖然它的方式是,但實際上並不是最好的方式。我會考慮做別的事情(假設一個輕量級的遷移不「只是工作」):

  • 給這個字符串屬性的新名稱
    • 創建你的子類的便捷覆蓋,拉老int和設置正在使用的新字符串;或
    • 如果您需要全部,請考慮執行遷移測試以確定是否需要遷移,然後在輕量級遷移(添加新屬性)之後遍歷實體並將int設置爲手動進行字符串轉換。

我建議這些選項,因爲重量重遷移是非常沉重的。它會造成內存問題,特別是如果你的數據存儲器甚至是遠程的。它會將兩個數據模型副本加載到內存中進行遷移。許多iOS應用程序無法處理。它也很慢,可能會導致啓動問題。

+0

我需要這樣做上的應用程序確實是非常大的,所以我想我會用一個小的演示文件試圖啓動。作爲一項完整性檢查,我剛剛使用核心數據爲iPhone開啓了一個新的主 - 細節應用程序。我運行應用程序一切都很好去,我打開了NSInferMappingModelAutomaticallyOption:@YES,NSMigratePersistentStoresAutomaticallyOption:@YES THEN我創建了模型2,並添加了一個名爲年齡Integer32的屬性,並再次構建,一切都很好,然後我建立了模型3關閉模型2,改變年齡類型字符串和一切都變得混亂! http://tinyurl.com/kc68a4x –

+0

這是不幸的,輕量級遷移不會做這種轉換。我會建議提交一份雷達,然後提出我的第二個建議。 –

5

不能使用輕量級遷移這所以它是有點困難(感謝蘋果),但也不是不可能

步步在Xcode 7.1:

1.創建新的模型版本:

  1. 選擇.xcdatamodeld模型 - >Editor - >Add model version ...
  2. 編輯新模型的實體的attribute type
  3. 變化當前模型版本到新的(文件檢查器)。你應該看到移動的綠色刻度標記。

Current model

2.定製核心數據映射模型

  1. New file -> Mapping Model(核心數據 - >映射模型)
  2. 選擇source(從模型)和target(至型號)
  3. 自定義地圖ping模型包含以這種方式調用的實體映射:NameToName。改變的屬性在目標實體在該文件中的變化值表達式反映你需要一個:FUNCTION($entityPolicy, "<*transformingMethodName*>" , $source.<*attributeName*>)

- transformingMethodName:將被稱爲變換屬性類型您的自定義方法。 (將在下一步驟中定義它 - 按住)

- 的attributeName:你的改變屬性名稱

  • 創建<*EntityName*>TransformationPolicy類作爲NSEntityMigrationPolicy
  • 一個子類實施您在上面定義的transformingMethodName(做你需要在那裏改變屬性類型)。請確保您加入這個方法將你的頭文件以及
  • 註冊這個類作爲映射模型自定義實體的移民政策(Model.xcmappingmodel - >文件檢查器 - >第三欄 - >自定義策略 - >輸入您TransformationPolicy類的名稱。)
  • Register migration policy class

    相關問題