2010-12-09 96 views
5

我的應用程序當前正在應用程序商店中,並且正在使用單個添加的屬性更新數據模型。我添加了一個模型版本並將其設置爲當前版本。核心數據輕量級遷移問題

一切正常,但是當我測試的應用程序的新版本通過包含數據的舊版本安裝時,應用程序無法加載沒有錯誤消息。它會繼續失敗(只是在屏幕上短暫閃爍),直到我重新啓動設備,或者通過XCode或iTunes再次安裝更新的應用程序,然後應用程序運行良好並且數據已正確遷移。

我的擔心是,如果客戶遇到這種情況,他們會在重新安裝前刪除應用程序並丟失所有數據。有沒有人有任何見解?任何幫助表示讚賞

謝謝, 我使用的應用程序爲代表的數據遷移下面的代碼:

- (NSManagedObjectModel *)managedObjectModel { 
    if (managedObjectModel != nil) { 
     return managedObjectModel; 
    } 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"DataStore" ofType:@"momd"]; 
    NSURL *momURL = [NSURL fileURLWithPath:path]; 
    managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL]; 
    return managedObjectModel; 
} 
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
    if (persistentStoreCoordinator != nil) { 
     return persistentStoreCoordinator; 
    } 
    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"DataStore.sqlite"]; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    if (![fileManager fileExistsAtPath:storePath]) { 
     NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"DataStore" ofType:@"sqlite"]; 
     if (defaultStorePath) { 
      [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL]; 
     } 
    } 
    NSURL *storeUrl = [NSURL fileURLWithPath:storePath]; 
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], 
    NSMigratePersistentStoresAutomaticallyOption, 
    [NSNumber numberWithBool:YES], 
    NSInferMappingModelAutomaticallyOption, nil];  
    NSError *error; 
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; 
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) { 
     // Update to handle the error appropriately. 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     exit(-1); // Fail 
    }   
    return persistentStoreCoordinator; 
} 

回答

1

你確定你做任何更改先前版本的模式?這種行爲聽起來像Core Data無法找到設備上持久存儲的模型。

當您啓動包含舊版持久性存儲的應用程序時,您應該能夠在控制檯日誌中看到任何Core Data錯誤。

也在什麼時候添加了新的屬性?如果您在創建新版本之前添加了它,舊版本和新版本都將具有該屬性。檢查你的舊模型,並確保新的屬性不存在。

+0

感謝您的回覆,我再次查看了數據模型,看起來正確。我也回到了我以前發佈的版本,並重新添加了一個新的數據版本,並獲得了相同的結果。 – 2010-12-10 01:09:30

+0

你有什麼建議,爲什麼從根本上說它不會第一次工作,但第二次成功的遷移工作很好嗎?我必須做些什麼才能確保它能夠第一次運行,也許原始數據模型沒有被正確讀取或者是什麼? – 2010-12-10 01:12:00

+0

當然,它的設計是第一次工作。我在我正在構建的應用程序中成功地使用了這種遷移,而且沒有問題。遷移發生時,是否有可能新創建的屬性未正確初始化?即您希望在插入而不是獲取時設置一些值?你是否已經配對了你的應用程序,以便除了嘗試遷移並顯示簡單的視圖控制器之外,它什麼也不做?看起來像是在遷移導致崩潰後訪問數據的東西。 – DigitalBytes 2010-12-10 03:16:21

0

不要忘記,您還需要應用程序中可用的源模式和目標模式才能進行遷移。

相關問題