应用程序更新后的Coredata

我正在尝试为我的应用程序实现一个stream程,以便在需要时更新应用程序,更新我的意思是在设备中下载新的应用程序。

问题是我正在使用CoreData来存储第一次启动时带来的服务器数据,旧版本和新版本之间我已经为DB添加了一些实体和一些旧实体的属性。 这就产生了冲突,因为我不知道如何处理迁移和/或任何可以为我提供在结构发生变化时重新创build数据库的能力的事情。

现在,如果我更新具有相同数据库结构的应用程序,该应用程序工作正常,但如果我修改它的应用程序崩溃,如预期的那样。

有什么想法吗?

如果应用程序中的数据可以从服务器重新创build/下载,那么有一个很好的解决scheme。 据我所知你从服务器获取数据,这是一个很好的例子,这意味着旧的数据可以在新的数据库中重新创build。 您不需要设置迁移堆栈,有一个非常快速的解决scheme。 诀窍是删除旧的SQLite数据库,并创build一个新的。

这是我在应用程序更新中使用的代码。 你需要在你的AppDelegate.m中添加这个

 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator
 {
     NSURL * storeURL = [[self applicationDocumentsDirectory] ​​URLByAppendingPathComponent:@“YourDatabase.sqlite”];
     NSManagedObjectModel * managedObjectModel = [self managedObjectModel];
     NSError * error = nil;
     _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];

     / /检查,如果我们已经有一个持久存储
     if([[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]){
         NSDictionary * existingPersistentStoreMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:storeURL error:&error];
         if(!existingPersistentStoreMetadata){
             //持久性商店发生了某些*真正*糟糕的事情
             // [NSException raise:NSInternalInconsistencyException格式:@“无法读取持久性存储的元数据%@:%@”,storeURL,error];
             NSLog(@“无法读取持久性存储的元数据%@:%@”,storeURL,错误);
         }

        如果(![managedObjectModel isConfiguration:nil compatibleWithStoreMetadata:existingPersistentStoreMetadata]){
             if(![[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error])
                 NSLog(@“***无法删除持久存储,%@”,错误);
         } //否则现有的持久性存储与当前模型兼容 - 很好!
     } //否则还没有数据库文件

     [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                              configuration:无
                                                        url:storeURL
                                                    选项:无
                                                      误差:&错误];
    返回_persistentStoreCoordinator;
 }

此代码涵盖了问题

  • 如果现有的数据库是旧的,则删除并build立新的数据库。
  • 如果还没有数据库(用户只下载最新的版本)比创build新的数据库。
  • 如果现有的数据库与新的数据库兼容,就使用它。

只需将@“YourDatabase.sqlite”更改为您的sqliteDB文件名,它将正常工作。

如果您只添加了一些实体/属性,则可以使用CoreData轻量级迁移:

1)在打开xcdatamodeld文件的情况下,从编辑器菜单中添加架构的新版本。

2)将新的实体属性添加到这个新的模式版本。

3)将新的模式版本设置为xcdatamodeld选项(左窗格)中的活动模式版本。

4)在UIApplicationDelegate的persistentStore初始化方法中,将NSMigratePersistentStoresAutomaticallyOptionNSInferMappingModelAutomaticallyOption设置为true。

您现在应该可以运行该应用程序。 模式应该自动更新以匹配您的新数据库结构。 这也将保留数据库内容,清空它可能是你想要在你的代码中做的事情,检测到新版本的第一次启动。