2010-09-17 65 views
2

我在iOS項目中使用Core數據。無論何時修改實體屬性,我都有自動數據遷移的數據模型設置。但我最近做了一些實體關係的一些變化,現在我的應用程序崩潰:「無法找到源存儲模型」Coredata手動移植

我意識到,重置應用程序,即刪除和重新安裝將解決這個問題,位I已經有一個實時版本,我的用戶將失去他們所有的數據!

因此,現在我正在嘗試手動遷移,但iOS文檔不是很有幫助。舉例來說,我有這樣的代碼,我創建一個模型映射後運行:

NSURL *destinationStoreURL = [NSURL fileURLWithPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: @"import.sqlite"]]; 

NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"db.sqlite"]]; 

//initialize migration manager 
NSMigrationManager *migrationManager = [[NSMigrationManager alloc] initWithSourceModel:[[self persistentStoreCoordinator] managedObjectModel] 
                     destinationModel:[[self persistentStoreCoordinator] managedObjectModel]]; 

//perform migration  
NSError *error = nil;  
NSMappingModel *mappingModel = [NSMappingModel inferredMappingModelForSourceModel:[[self persistentStoreCoordinator] managedObjectModel] 
                   destinationModel:[[self persistentStoreCoordinator] managedObjectModel] error:&error]; 

if (mappingModel == nil) { 
    NSLog(@"No Mapping model error %@, %@", error, [error userInfo]); 
} 

[migrationManager migrateStoreFromURL:sourceStoreURL 
           type:NSSQLiteStoreType 
           options:nil 
        withMappingModel:mappingModel 
        toDestinationURL:destinationStoreURL 
         destinationType:NSSQLiteStoreType 
        destinationOptions:nil 
           error:&error]; 

運行這段代碼的工作和重置數據庫,但我不能找到我的舊數據,當我保存任何新的數據,我得到沒有持久存儲的錯誤!

有沒有人有任何想法?

+0

誇,我也同樣的問題,但我解決不了。這篇文章正是我發生的事情。 – Xeieshan 2014-03-06 06:37:05

回答

1

的人是正確的...

如果它不是爲時已晚,試試這個:打開你的「[數據庫] .xcdatamodel」文件。然後(假設你正在使用Xcode),進入你的主菜單。選擇設計>數據模型>添加模型版本。這將創建一個新文件,在我們的例子中,「[你的數據庫] 2.xcdatamodel」:

現在轉到設計>數據模型>設置當前版本。這樣做會告訴Xcode,這是數據庫架構可以使用。現在,讓你想要的任何數據庫架構更改。現在可能是一個好時機作出任何代碼更改您的數據庫架構的變化已直接影響。

現在編譯程序。這一次,它應該加載。

我遇到了同樣的麻煩,這是我第一次真正閱讀iPhone開發文檔,我必須真正關注,現在我全部設置好了,實際上我選擇了輕量級遷移,這個代碼是劫持d直接從蘋果的示例程序一個(或幾個)(通常都有漏洞,只是讓你知道...: - /)

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
if (persistentStoreCoordinator != nil) { 
    return persistentStoreCoordinator; 
} 

NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] 
     stringByAppendingPathComponent:DATABASENAME]]; 
NSError *error; 
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:  
    [self managedObjectModel]]; 

// Allow inferred migration from the original version of the application. 
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
     [NSNumber numberWithBool:YES], 
     NSMigratePersistentStoresAutomaticallyOption, 
     [NSNumber numberWithBool:YES], 
     NSInferMappingModelAutomaticallyOption, nil]; 

//ATTENTION: YOU WERE CRASHING HERE... 
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
configuration:nil URL:storeUrl options:options error:&error]) { 
     // Handle the error. 
     NSLog(@"WTF??? FAILED to create automatic lightweight migration. Error[%@]", error); 
}  
0

您是否從設計菜單中設置了當前版本?假設選項NSMigratePersistentStoresAutomaticallyOption和NSInferMappingModelAutomaticallyOption設置爲YES,自動遷移應該可以工作。

+0

自動遷移不起作用,因爲我更改了媽媽文件中的關係。所以蘋果文檔建議我進行手動遷移。所以我創建了一個映射模型,比較了源和目標實體。刪除不匹配的屬性,然後添加上面的手動遷移代碼(在註釋掉輕量級遷移後)。這給我一個新的數據庫。所以現在我找不到舊的數據庫! – Kwame 2010-09-18 15:13:31

+0

我想我錯誤地設置了映射管理器和遷移管理器。請看看上面的代碼,看看你的想法。我不確定要使用什麼作爲源模型和目標模型。也許問題在於我對兩者都使用相同的模型!但是目的地模式是什麼? – Kwame 2010-09-18 15:23:49

1

核心數據將首先檢查您的數據模型是否與當前數據存儲兼容,但如果您修改了關係,則不會是這種情況。您需要首先添加一個模型版本,可以從Xcode中選擇數據模型,然後從菜單中選擇設計>數據模型>添加模型版本。您還需要設置模型的當前版本。

Apple有關於遷移的一些很好的資源。

+0

謝謝。我認爲你所描述的是自動輕量級遷移,我已經嘗試過了。它通常會給出一個錯誤:reason =「無法找到源存儲模型」;所以這導致我嘗試手動遷移。 – Kwame 2010-09-18 15:08:52

0

輕量級遷移:對於那些誰,即使按照上述失敗後腳步!

只要確保重命名DATABASE.sqlite一樣DATABASE.xcdatamodeld,並把他們都在同一個位置是Documents目錄下:)好運氣