2017-08-04 35 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手动移动它。 –

相关问题