核心数据在更新应用程序时创建额外的空存储

时间:2017-08-04 17:53:12

标签: ios core-data

我正在研究几年前使用Core Data的应用程序的更新。以前的版本将其数据存储在Documents / app-name.sqlite中。我没有更改更新中任何与数据相关的代码,但是当我第一次启动新版本时,它在Library / Application Support / app-name.sqlite创建一个新的空数据存储。我不知道如何解决这个问题。

初始Core Data设置如下所示:

    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 个答案:

答案 0 :(得分:1)

新的NSPersistentContainer类对于创建内容的位置和方式有一些约定。默认情况下,当您传入{name}时,它将查找名为" {name} .momd"的模型文件。并将在" Application Support"中创建一个sqlite文件。命名为" {name} .sqlite"。可以覆盖这些默认值。

创建容器后,但在调用load之前,您应该这样做:

夫特:

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

的OBJ-C:

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

这将重置用于商店的默认网址。