0

我正在嘗試執行輕量級遷移,但由於創建初始數據模型的方式而產生問題。沒有版本的初始數據模型,所以現在下面的代碼:核心數據自動輕量級遷移 - 從未版本化切換到版本化數據模型

-(NSManagedObjectModel *)managedObjectModel { 

    //NSLog(@"%s", __FUNCTION__); 
    if (managedObjectModel != nil) { 
     return managedObjectModel; 
    } 
    //managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 

    NSString *mainPath = [[NSBundle mainBundle] pathForResource:@"myDatabase" ofType:@"momd"]; 

    NSURL *mainMomURL = [NSURL fileURLWithPath:mainPath]; 
    managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:mainMomURL]; 
    return managedObjectModel; 
} 

返回錯誤:*終止應用程序由於未捕獲的異常 'NSInvalidArgumentException',原因是:「* - [NSURL initFileURLWithPath:]:無字符串參數'

我非常確定這是因爲最初的數據模型 - 我已經在我的應用程序中部署給很多人的模型 - 具有媽媽擴展,而不是momd擴展。但是,如果我參加了這一點,並恢復到

managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 

我得到的錯誤:終止應用程序由於未捕獲的異常「NSInvalidArgumentException」,理由是:「不能合併使用兩個不同的實體模型命名...

我希望這不是第一次有人遇到這種情況...有什麼我可以做的,以便我可以成功遷移所有當前用戶?

+0

我希望Marcus Zarra會在.. – SAHM

+0

任何想法?我錯過了明顯的東西嗎? – SAHM

回答

0

好的,取得進展。按照雄二在這個鏈接的回答:Can't find momd file: Core Data problems

,我決定去與行:

managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 

在設備上安裝舊版本後,加入一些數據,做一個乾淨的構建與新​​版本然後在設備上安裝新版本,一切都正確更新。關於在模擬器和我的其他目標再次嘗試。這很瘋狂,你有時覺得你做了同樣的事情,有時會得到不同的結果嗎?一旦我得到更進一步的信息,我會發布更新...

編輯: 一些有趣的進展。就目前而言,這個項目是作爲我的一個應用程序開始的,並且在兩個應用程序部署到應用程序商店後,我在另一個應用程序中添加了代碼重用的類似代碼(作爲單獨的目標)。由於他們的數據庫基本上是相同的,我只是使用相同的xcdatamodel。這工作得很好,直到我開始處理這個遷移問題。原來,上述的managedObjectModel代碼確實可以用於項目中的原始目標,但不適用於新目標。

然後,我發現了由Marcus Zarra此評論:

He probably either renamed the model or set up a version, both of which will leave an old compiled .mom file in the build directory. That is the #1 cause of this error I have seen.

在這個環節

Core Data: Error, 「Can't Merge Models With Two Different Entities Named 'foo' 」

好吧,也許我們現在得到這裏的某個地方。問題是 - 我現在是否需要將我的其他原始數據模型引入到項目中,並更新IT?我們從哪裏出發?

編輯:好的,我想我已經在這個問題上取得了一些很好的進展。請隨時糾正我下面的任何一個。但是,從我迄今瞭解到的情況來看:

Bundle Name應該保持不變,否則會出現遷移問題。這意味着,根據我的理解,可能會保留產品名稱。但是,它好像更改了Bundle Display Name(與Bundle Name不同,並且也設置在app-info中)。plist文件)不會傷害事物,並且實際上完成了目的或者首先改變了Bundle Name。從原始數據模型轉換到版本化數據模型完全沒問題,事實上,這是第一次遷移通常會發生的情況。所以沒有問題。

另一個教訓 - 數據模型名稱和.sqlite文件名稱不一定相同!我的(很多)錯誤之一是在尋找momd文件時使用.sqlite文件名。當你尋找momd文件(當在應用代理中設置managedObjectModel時) - 使用xcdatamodel文件的名稱!根據這些原則,我不確定在遷移期間是否應該使用「mergedModelFromBundles」或「initWithContentsOfURL」。一旦我有正確的文件名,initWithContentsOfURL工作正常(我仍然有一些測試要做,但我已經得到它在模擬器和設備上的兩個應用程序的目標,分數。 xcdatamodels和xCode 4 - 什麼令人頭疼,出於某種原因,我無法刪除xCode 4中的臨時/未使用/不需要的數據模型版本。所以,我必須做很多奇特的步驟才能正確地獲得這些JUST,包括刪除模型本身(僅供參考),使用Finder中的「顯示包裝內容」進行更改,然後重新添加模型。這樣做時應該非常小心。我發現一件非常有趣的事情是我需要兩個xcdatamodels,一個對於我正在使用的每個應用目標,並且xcdatamodel的標題需要與之前部署的標題匹配版本遷移到工作。不僅如此,當前的模型需要成爲沒有數字的模型 - 它需要完美匹配我部署的應用程序中模型的名稱。

這真的很棘手,因爲當我重命名模型並將不同模型設置爲當前版本時,xCode 4並不總是要合作。有一件有趣的事情是,當我必須將樹中另一個模型下面的模型設置爲當前模型時,xcode在運行時不會那樣。因此,我實際上必須進入Finder中的.xcodeproj文件(關閉應用程序),顯示軟件包內容,編輯project.pbxproj文件,以及更改數據模型的順序以將當前的文件放在列表頂部。

嗯,我認爲這主要是一切。如果我想到其他東西,我會在這裏添加它。仍然想再測試一下,但我希望我學到的一些東西能夠幫助別人。我知道我做了很多駭人的事情,但絕望的時代呼籲採取絕望的措施,而當我們知道更好,我們做得更好......希望這會有所幫助。