核心数据 - 轻量级迁移不起作用
Core Data - Lightweight migration doesn't work
我是 Core Data 的新手,目前正在使用 Core Data 维护一个应用程序。
由于需要尽快发布新版本的应用程序,我必须将实体添加到数据模型中。
我已经学习了本教程 Lightweight tutorial which was very useful but also I have read all the Apple documentation but also this amazing article Core Data Migration 以便全面了解它的工作原理。
虽然我只需要向数据模型添加一个实体,但我听说在这种情况下轻量级迁移是可以的。
只有 1 个新实体(没有属性)我必须 link 到已经存在的父实体。
到目前为止我做了什么:
- 该应用程序当前使用的是数据模型的第 3 版
- 我从版本 3 创建了一个新的数据模型(版本 4)
- 我已选择数据模型版本 4 作为当前数据模型
- 我已经创建了我的新实体(没有属性),并将其link编辑到父实体。
- 我已经创建了生成的 class 对象
- 然后我修改了我的UI
构建并 运行,它运行良好,很酷。但是当我从 AppStore 下载当前版本时,当我从 TestFlight 安装最近制作的新 Archive/IPA 时,(安装在旧版本上 -> 迁移场景)应用程序 运行 没有我的新 Entity/Datamodel.
从Apple的文档中可以看出,Core Dara轻量级迁移支持添加Entity
我知道这不是一个容易的过程,但我觉得我已经完美地完成了所有事情。
如何在没有每次存档、在 TestFlight 上发布等的情况下测试迁移...
如果您需要任何其他信息以清楚地理解我的问题and/or写一个更详细的答案,请随时在评论中提问,我会编辑我的问题。
提前谢谢你。
编辑:
这是 AppDelegate 中关于 NSPersistentStoreCoordinator 的代码。
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
// The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it.
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
// Create the coordinator and store
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSURL *storeURL = [self persistentStoreURL];
NSError *error = nil;
NSString *failureReason = @"There was an error creating or loading the application's saved data.";
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:@{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES} error:&error]) {
// Report any error we got.
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";
dict[NSLocalizedFailureReasonErrorKey] = failureReason;
dict[NSUnderlyingErrorKey] = error;
error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
// Replace this with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
DDLogError(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
不知道如何通过测试或日志有效知道CoreData使用了新的数据模型(版本4)并且迁移成功。
我知道它在我从 xCode 构建时有效,但它与从 AppStore 更新的情况不同。
要为轻量级迁移设置应用程序,您需要将以下行插入到声明持久存储的 CoreData 框架中。这些设置启用支持轻量级迁移的选项(这些来自 Swift 3.0 应用程序,因此如果您使用的是 2.3,它们可能会有所不同):
NSMigratePersistentStoresAutomaticallyOption as NSObject: true
NSInferMappingModelAutomaticallyOption as NSObject: true
一旦这些行就位,CoreData 将在需要时正确执行轻量级迁移,包括添加新的实体、属性和关系,因此只要您不做任何需要更多的事情就应该没问题您的操作 - 例如更改实体名称或 属性.
我是 Core Data 的新手,目前正在使用 Core Data 维护一个应用程序。
由于需要尽快发布新版本的应用程序,我必须将实体添加到数据模型中。
我已经学习了本教程 Lightweight tutorial which was very useful but also I have read all the Apple documentation but also this amazing article Core Data Migration 以便全面了解它的工作原理。
虽然我只需要向数据模型添加一个实体,但我听说在这种情况下轻量级迁移是可以的。
只有 1 个新实体(没有属性)我必须 link 到已经存在的父实体。
到目前为止我做了什么:
- 该应用程序当前使用的是数据模型的第 3 版
- 我从版本 3 创建了一个新的数据模型(版本 4)
- 我已选择数据模型版本 4 作为当前数据模型
- 我已经创建了我的新实体(没有属性),并将其link编辑到父实体。
- 我已经创建了生成的 class 对象
- 然后我修改了我的UI
构建并 运行,它运行良好,很酷。但是当我从 AppStore 下载当前版本时,当我从 TestFlight 安装最近制作的新 Archive/IPA 时,(安装在旧版本上 -> 迁移场景)应用程序 运行 没有我的新 Entity/Datamodel.
从Apple的文档中可以看出,Core Dara轻量级迁移支持添加Entity
我知道这不是一个容易的过程,但我觉得我已经完美地完成了所有事情。
如何在没有每次存档、在 TestFlight 上发布等的情况下测试迁移...
如果您需要任何其他信息以清楚地理解我的问题and/or写一个更详细的答案,请随时在评论中提问,我会编辑我的问题。
提前谢谢你。
编辑:
这是 AppDelegate 中关于 NSPersistentStoreCoordinator 的代码。
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
// The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it.
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
// Create the coordinator and store
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSURL *storeURL = [self persistentStoreURL];
NSError *error = nil;
NSString *failureReason = @"There was an error creating or loading the application's saved data.";
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:@{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES} error:&error]) {
// Report any error we got.
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";
dict[NSLocalizedFailureReasonErrorKey] = failureReason;
dict[NSUnderlyingErrorKey] = error;
error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
// Replace this with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
DDLogError(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
不知道如何通过测试或日志有效知道CoreData使用了新的数据模型(版本4)并且迁移成功。
我知道它在我从 xCode 构建时有效,但它与从 AppStore 更新的情况不同。
要为轻量级迁移设置应用程序,您需要将以下行插入到声明持久存储的 CoreData 框架中。这些设置启用支持轻量级迁移的选项(这些来自 Swift 3.0 应用程序,因此如果您使用的是 2.3,它们可能会有所不同):
NSMigratePersistentStoresAutomaticallyOption as NSObject: true
NSInferMappingModelAutomaticallyOption as NSObject: true
一旦这些行就位,CoreData 将在需要时正确执行轻量级迁移,包括添加新的实体、属性和关系,因此只要您不做任何需要更多的事情就应该没问题您的操作 - 例如更改实体名称或 属性.