2011-09-13 91 views
4

我有一個棘手的問題,我無法找到答案。我的數據模型的結構是這樣的:核心數據丟失的關係應用程序後,升級

版本1:
項目有許多地方
位置都有很多項目
但由於失誤而兩者之間的逆從未設置過。

版本2:
與上面相同,但現在設置爲反向。

我的問題的一個例子如下:
在版本1中,我有兩個項目擁有相同的位置。當我啓動第2版和我的映射模型被處理,原計劃將自己的位置失去它的那個位置關係,現在所在的位置顯示時,只有這些項目,而不是他們兩個中的一個組成部分。

我承認,這個問題可能是由我不設立項目和位置之間的反比關係引起的,但有什麼我可以做,使整個應用程序/數據模型的兩個版本的數據仍然存在?

編輯︰ 我已經嘗試推斷的映射模型,我已經嘗試手動創建映射模型。我目前只使用NSMigratePersistentStoresAutomaticallyOption鍵時,我創造了我NSPersistentStoreCoordinator

而且,僅僅是明確的,我有我的數據模型的兩個版本,並移植成功發生,唯一的問題是,隨着預期的關係並不持久。

編輯2: 我已經想通了,我需要繼承NSEntityMigrationPolicy。我不想進行完全自定義的遷移,如果可能,我寧願自動保留剩餘的遷移。有沒有人知道任何好的教程或NSEntityMigrationPolicy子類的例子,這將與我的目的有關?我一直無法找到很多,據我所知,在蘋果文檔中極少提及它。

編輯3: 我不能爲我的生活弄清楚如何使用NSEntityMigrationPolicy設置反比關係。我的問題現在比前面描述的有點不同。有沒有人知道如何做到這一點的任何可靠的例子?

+0

「我的映射模型被處理」 - >把你的模型映射到這裏的代碼。 – Nekto

回答

0

對於其他任何人遇到這種情況,實際上是一個非常簡單的答案,我還沒有求索紅。

我沒有太過努力嘗試子類NSEntityMigrationPolicy - 我找不到任何超出基本範圍的示例代碼。在某些情況下,子類NSEntityMigrationPolicy可能是最好的解決方案。但是如果你和我的情況一樣 - (意思是你已經在你的模型中設置了反向關係的正確字段,但你忘記了實際指定反向),我相信我有一個更簡單的解決方案。

相反子類NSEntityMigrationPolicy的,我做了以下(實際上是簡單得多IMO):

(記住,我的模型的設置如下:項目< - >位置,一有 - 和 - 屬於多對的關係)

  1. 我在我的應用程序中保留了我的舊數據模型(.xcdatamodel)文件。當我的應用第一次加載時,它會從舊的數據模型文件加載我的NSManagedObjectModel。然後,我開始循環遍歷數據庫中的所有項目,並遍歷每個項目的所有位置,併爲每個位置手動設置「項目」字段 - 如果我第一次將模型設置爲正確,這將使用反向關係自動完成。這裏是我的代碼如下所示:

    NSArray *projects = [context executeFetchRequest:request error:&error]; 
    for(Project *project in projects) { 
        for(Location *location in project.locations) { 
         // set the inverse relationship manually 
         [location addProjectsObject:project]; 
        } 
    } 
    
  2. 我救了我的NSManagedObjectContext

  3. 然後,我擺脫了我的NSManagedObjectContextNSManagedObjectModelNSPersistentStoreCoordinator並使用我的新xcdatamodel文件重建它們。新的模型文件包含相反的關係,並且他們正確設置。從SQLite數據庫遷移數據時,所有數據都保持不變,而我手動設置的相反關係仍然存在。在創建新的NSPersistentStoreCoordinator時,請確保指定NSMigratePersistentStoresAutomaticallyOption選項。

1

使用自動遷移模型設置你的持久存儲協調,看看是否可行。另外,你確實創建了一個新的模型版本,對吧?如果沒有適當的模型,核心數據就無法映射。

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 


    NSError *error = nil; 

persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; 
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) { 
    // Handle error 
    } 
+0

是的,我設置了一個新的模型版本。升級是成功的,但關係失去了。我會嘗試自動遷移,謝謝你的提示。 –

+0

沒有推測的映射模型的運氣,它具有與我手動創建的映射模型相同的結果(這是有道理的 - 似乎推斷的映射模型只是強制捆綁中的不同模型,直到它找到一對適合)。 –

1

您的第二個模型意外地將關係從'一對多'改變了嗎?

如果是這樣,那麼當您的遷移從舊模型轉換爲新模型時,您的遷移可能只會將其分配給一個項目。

(這是猜測!)

+0

不,謝謝你的猜測。 –

3

倒黴。

你將不得不通過繼承NSEntityMigrationPolicy :(

採取documentation here的讀手動遷移 - 特別是關於自定義實體移民政策的部分

你必須創建自己的反比關係作爲遷移的一部分。

小號

+0

是的,我在今天早上的文檔中看到了這一點,但實際上我沒有找到一個很好的例子來說明如何去做。我不想手動遷移一切,我相信我可以遷移某些實體。 –

+0

大閱讀!!!!! – RJR