【问题标题】:Core Data Migration: How to delete the Core Data stack?Core Data Migration:如何删除 Core Data 堆栈?
【发布时间】:2012-02-11 18:02:04
【问题描述】:

我的计划是删除旧的核心数据堆栈(NSManagedObjectModel.momd 文件和NSPersistentStore.sqlite 文件),因为:

  • 我没有 Core Data 迁移的经验。
  • 新的 .xcdatamodel 架构与旧架构完全不同。
  • 我可以安全地删除用户的旧数据,因为它们都存储在我们的服务器上,而新应用程序无论如何都会从我们的服务器下载最新数据。

在这种情况下,完全删除是进行迁移的最佳方式吗?

【问题讨论】:

    标签: iphone objective-c ios core-data core-data-migration


    【解决方案1】:

    如果您创建一个空白的 Core Data 应用程序,您会在 Application Delegate 的 Apples cmets 中找到必要的代码:

    如果您在开发过程中遇到架构不兼容错误,您 可以通过以下方式减少他们的频率:

    • 只需删除现有存储:[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]

    • 通过传递以下字典作为选项执行自动轻量级迁移 参数:@{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES} 轻量级迁移仅适用于有限的架构更改;请参阅“核心数据模型版本控制和数据迁移 编程指南”了解详情。

    【讨论】:

      【解决方案2】:

      如果您的应用程序无论如何都需要访问互联网,这是一件非常有效的事情。否则用户可能会留下一个空的数据集(当您发现旧数据库与当前模型不兼容时,您将其删除,但您无法在没有访问服务器的情况下重新填充它)。

      从技术上讲,这是一件微不足道的事情。当你设置NSPersistentStoreCoordinator:

      NSURL *storeURL = ...;
      NSManagedObjectModel *managedObjectModel = ...;
      NSError *error = nil;
      _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: managedObjectModel];
      
      // Check if we already have a persistent store
      if ( [[NSFileManager defaultManager] fileExistsAtPath: [storeURL path]] ) {
          NSDictionary *existingPersistentStoreMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType: NSSQLiteStoreType URL: storeURL error: &error];
          if ( !existingPersistentStoreMetadata ) {
              // Something *really* bad has happened to the persistent store
              [NSException raise: NSInternalInconsistencyException format: @"Failed to read metadata for persistent store %@: %@", storeURL, error];
          }
      
          if ( ![managedObjectModel isConfiguration: nil compatibleWithStoreMetadata: existingPersistentStoreMetadata] ) {
              if ( ![[NSFileManager defaultManager] removeItemAtURL: storeURL error: &error] )
                  NSLog(@"*** Could not delete persistent store, %@", error);
          } // else the existing persistent store is compatible with the current model - nice!
      } // else no database file yet
      
      [_persistentStoreCoordinator addPersistentStoreWithType: NSSQLiteStoreType 
                                                configuration: nil 
                                                          URL: storeURL 
                                                      options: nil 
                                                        error: &error];
      

      【讨论】:

      • 在更新后的初始启动时收到此错误 SQLite 错误代码:11,“数据库磁盘映像格式错误”。但在随后的启动中,这不是问题,因为 sqlite 文件已被删除。但似乎我无法避免这种一次性应用程序崩溃。并且感觉应用程序在更新后立即崩溃有点令人失望。有什么想法吗??
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      相关资源
      最近更新 更多