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

标签 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 文件出现了。

这是怎么回事,更重要的是,我该如何解决?谢谢。

最佳答案

新的 NSPersistentContainer 类在创建内容的位置/方式方面有一些约定。默认情况下,当您传入 {name} 时,它将查找名为“{name}.momd”的模型文件,并在“应用程序支持”中创建名为“{name}.sqlite”的 sqlite 文件。这些默认值可以被覆盖。

创建容器之后,但在调用 load 之前,您应该执行以下操作:

swift :

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

objective-C :

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

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

关于ios - 核心数据在更新应用程序时创建额外的空存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45512830/

相关文章:

ios - 使自定义 View 的框架适合在 drawRect 中绘制的图像

ios - 关于哪些信息可以存储在 Info.plist 中的一些示例?

ios - 将 CAShapeLayer 角上的破折号与虚线边框对齐

swift - 从网络服务更新核心数据。 (插入/更新/删除)

ios - 另一个实体的核心数据过滤器

iOS UIDynamics 附件行为显示线条

php - 使用基于 PHP XML 的 Web API 的 iOS 应用程序

ios - 从 coredata swift 获取特定属性

iphone - 找不到用于迁移的映射模型,映射模型要到哪里去?

ios - 核心数据 : Can't modify an immutable model