2017-08-04 50 views
0

我正在對幾年前的應用程序進行更新,並使用核心數據。以前的版本將其數據存儲在Documents/app-name.sqlite中。我沒有更改任何與更新中的數據相關的代碼,但是當我第一次啓動新版本時,在Library/Application Support/app-name.sqlite處創建了一個新的空數據存儲。我不知道如何解決這個問題。核心數據在更新應用程序時創建額外的空存儲

最初的核心數據設置是這樣的:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:SKCoreDataModelName withExtension:@"momd"]; 
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 


    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:[SKCoreDataModelName stringByAppendingString:@".sqlite"]]; 
    NSError *error = nil; 
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 

    NSDictionary *opts = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
          [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
          nil]; 
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:opts error:&error]) { 
     SKLogError(@"Unresolved error when creating persistent store coordinator %@, %@", error, [error userInfo]); 
    } 

這似乎在新版本中正常工作:觸發沒有錯誤,創建新的數據庫。就會出現問題,當我初始化持久化容器:

 _persistentContainer = [[NSPersistentContainer alloc] initWithName:SKCoreDataModelName]; 
     [_persistentContainer loadPersistentStoresWithCompletionHandler:^(NSPersistentStoreDescription *storeDescription, NSError *error) { ... }]; 

通過此步進,我可以看到,當我初始化NSPersistentContainer,所述Library/Application Support文件夾顯示在模擬器數據;當我打電話loadPersistentStoresWithCompletionHandler時,新的sqlite文件出現。

這裏發生了什麼,更重要的是,我該如何解決這個問題?謝謝。

回答

1

新的NSPersistentContainer類在創建事物的地方/方式方面有一些約定。默認情況下,當您傳入{name}時,它將查找名爲「{name} .momd」的模型文件,並將在名爲「{name} .sqlite」的「Application Support」中創建一個sqlite文件。這些默認值可以被覆蓋。

創建容器後,但調用加載之前,您應該這樣做:

斯威夫特:

let description = NSPersistentStoreDescription(url: storeURL); 
_persistentContainer.persistentStoreDescriptions = [description]; 

的OBJ-C:

NSPersistentStoreDescription *_description = [NSPersistentStoreDescription persistentStoreDescriptionWithURL:storeUrl: storeUrl]; 
_persistentContainer.persistentStoreDescriptions = @[description]; 

這將重置默認網址用於商店。

+0

就是這樣!非常感謝! (請注意,實例化商店描述的調用實際上是[NSPersistentStoreDescription persistentStoreDescriptionWithURL:storeUrl]) 雖然我寧願將事情轉移到默認值,但老實說,遷移現有商店的最佳方法是什麼到應用程序支持中的標準位置? –

+0

我不知道是否有辦法自動做到這一點,我可能只是使用NSFileManager手動移動它。 –

相關問題