關于MagicalRecord在版本遷移的問題

我現在維護的項目的數據庫方面,使用的是CoreData,完全自己手寫相關的代碼,整個工程的使用一個xcdatamodeld,NXMain.xcdatamodeld,版本升級維護到了ver21。

現今組長想拆分,根據組內成員各自負責的模塊來創建多個xcdatamodeld,并且使用第三方庫MagicalRecord來簡化代碼,由于數據庫涉及的代碼比較多,項目時間緊,所以不能在一次迭代中更改完成,需要分版本進行:

第一個版本,僅僅將消息模塊的數據庫替換,新建Message.xcdatamodeld,把相關的entity全部創建在此model中;

第二個版本,將圈子相關的數據庫替換,新建Circle.xcdatamodeld,寫這篇文檔的時候是在第三個版本的開發過程中;

第三個版本,將所有的模塊全部全部替換成新數據庫,創建多個xcdatamodeld,開發中要對message的一個entity添加一個字段,于是給Message.xcdatamodeld升級到ver2。

一個問題出現了,數據庫在iOS8的設備上自動遷移出現了問題,提示說“Can't find model for source store”,控制臺打印了,新舊數據庫的設置信息,以及各個entity的hash值,具體的log就不在此粘貼了。

然后在stackoverflow,以及MagicalRecord的github上的issue上查找該問題,其他人也遇到過該問題。

MagicalRecord在生成NSManagedObjectModel的時候調用了mergedModelFromBundles:方法,而該方法會將工程中所有的entity匯集在一起,包括項目中Pod里面的xmpp對應entity,在一個sqlite中生成對應的表,而我們只是想生成我們新建的xcdatamodeld對應的表。所以問題的解決方案如下:

將這個工程的xcdatamodeld集合到一個NXMainCoreData.xcdatamodeld中,包括pod中得xcdatamodeld,還包括對應的relationship,已經各種設置,這個是NXMainCoreData.xcdatamodeld的第一個版本,然后升級一個版本,就是ver2,想怎么改就怎么該,在ver2中,我將xmpp對應的entity刪除了,當然還有其他的操作,然后在[MagicalRecord setupCoreDataStack],要設置一下MagicalRecord默認的NSManagedObjectModel:

NSString* DatabaseFileMODEL =@"NXMainCoreData";

NSURL*modelURL = [[NSBundlemainBundle]URLForResource:DatabaseFileMODELwithExtension:@"momd"];

if(modelURL ==nil)

modelURL = [[NSBundlemainBundle]URLForResource:DatabaseFileMODELwithExtension:@"mom"];

if(modelURL !=nil) {

NSManagedObjectModel* model = [[NSManagedObjectModelalloc]initWithContentsOfURL:modelURL];

if(model !=nil) {

[NSManagedObjectModelMR_setDefaultManagedObjectModel:model];

}

}

這樣MagicalRecord只會生成NXMainCoreData對應的entity的表了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容