2015-10-15 58 views
0

我試圖在覈心數據模型上執行自定義遷移,但遷移的唯一數據是與自定義遷移相關聯的數據。魔法記錄自定義核心數據遷移不提取現有數據

在以前的版本我的申請,我是用

[MagicalRecord setupCoreDataStackWithStoreNamed:@"xxxxxx.sqlite"]; 

要啓用自動遷移我切換到使用。

[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"MTDataStore.sqlite"]; 

在新的應用程序版本,我還創建了一個新的模型版本,映射模型,並用於遷移自定義轉換政策。預先存在的版本總共有4個型號。

對模型所做的更改包括爲一個實體添加的屬性,這應該由自動遷移設置來處理。另一個變化是從實體中刪除4個屬性(attr1,attr2,attr3,attr4),並向該實體添加一個屬性(鍵)。然後,我將舊屬性映射到字符串的新屬性「鍵」。

這是我爲轉換策略所針對的'key'屬性設置的值表達式。

FUNCTION($entityPolicy, "keyToJSONString:" , $source) 

這是轉換策略中的代碼。

-(NSString*)keyToJSONString:(MTWirelessCDKey*)wirelessCDKey 
{ 
    NSString *lengthJSON = [MTUtility JSONString:wirelessCDKey.length]; 
    NSString * jsonKey = [NSString stringWithFormat:@"{\"gauge\":\"%@\",\"length\":\"%@\",\"diam\":\"%@\",\"head\":\"%@\"}", 
          wirelessCDKey.attr1, 
          lengthJSON, 
          wirelessCDKey.attr2, 
          wirelessCDKey.attr3]; 
    return jsonKey; 
} 

當我運行使用Xcode中應用程序的新版本,在安裝了舊版本,具有映射模型和自定義轉換政策模型顯示了在我的SQLite數據庫正確的數據,但所有的與其他三個模型相關的數據丟失。

僅用於故障排除目的,我試圖爲不同的模型創建映射模型,這從我的理解是不必要的。當我運行新的應用程序時,該模型的數據會隨之而來,但不是之前運行的模型。

在新版本的應用程序中,我還將運行遷移的模型設置回原始,只是爲了確保其他數據通過正常運行,然後將所有舊數據拉過來。

任何建議,將不勝感激。

注意:這一切都是在設備上的Xcode 7(iOS 9 SDK)中的Objective-c中完成的。

更新: 所以,我花了近24小時左右,真正攻擊這個問題,並意識到,我沒有什麼實際發生的事情有很好的理解,當我開始這個問題。所以我現在要用解決方案更好地解釋它。

當我最初創建項目時,我設置了4個不同的xcdatamodeld引用。所有這些都被存儲在同一個sqlite存儲中。現在根據我讀過的內容創建多個xcdatamodelds並不一定是壞事,但是您需要確保將它們存儲在自己的sqlite存儲中。

因此,我發現/想出的解決方案其實很簡單。由於我將所有數據存儲在同一個sqlite存儲中,因此我可以將所有xcdatamodeld對象合併爲一個。

假設你有4個xcdatamodeld對象。 xcdatamodeld1,2,3和4.

您可以將xcdatamodeld1,2和3手動合併到xcdatamodeld4中,方法是打開查找器中的模型對象並將xml合併到一個文件中。當您下次啓動核心數據存儲時,看起來好像沒有任何變化。

之後,您可以像平常一樣運行遷移。

回答

1

問題是在Xcode項目中有多個xcdatamodeld對象被全部存儲到同一個sqlite存儲中。

要解決我手動合併所有xcdatamodeld物體在一個模型對象在取景器打開模型對象,在一個文本編輯器中打開文件夾的內容,複製XML實體對象和合並的元素項目所涉及的問題指定型號。

然後刪除現在包含在合併的xcdatamodeld中的舊xcdatamodeld對象。

一旦你有了,讓我們說一個規範化的xcdatamodeld對象,你可以像平常一樣運行遷移。