我刚创建了一个新版本的核心数据模型,其中包含一个额外的对象以及重新设计的关系。
我现在有两个文件,Medical_Codes.xcdatamodel
和Medical_Codes_ 2.xcdatamodel
。
我是否必须删除旧的NSManagedObject
类文件并重新创建它们?
我是否必须更改持久性商店代码?
- (NSManagedObjectModel *)managedObjectModel
{
if (__managedObjectModel != nil)
{
return __managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Medical_Codes" withExtension:@"mom"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return __managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (__persistentStoreCoordinator != nil)
{
return __persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Medical_Codes.sqlite"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:[storeURL path]])
{
NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Medical_Codes" ofType:@"sqlite"];
if (!defaultStorePath)
{
NSLog(@"Error: Could not locate Medical_Codes.sqlite in app bundle");
return nil;
}
NSError *error = nil;
if (![fileManager copyItemAtPath:defaultStorePath toPath:[storeURL path] error:&error])
{
NSLog(@"Error copying sqlite from bundle to documents directory: %@, %@", error, [error userInfo]);
return nil;
}
}
NSError *error = nil;
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return __persistentStoreCoordinator;
}
答案 0 :(得分:4)
CoreData提供数据库旧架构到新架构的各种级别的迁移。有时您可以执行轻量级迁移,这意味着除了创建新模型和生成新的托管对象类之外,您不必执行任何特殊操作。下次启动应用程序时,模型管理器会发挥其魔力并将旧数据迁移到新模式。
但是,当您的新模型与旧模型明显不同时,您需要创建一个模型映射文件,该文件为CoreData提供必要的迁移信息,以便从旧映射到新映射。此映射模型文件由Xcode复制到您的包中,模型管理器使用它来进行必要的迁移。
您还需要在运行时创建持久性存储协调器期间传递一些其他选项(所以,是的,您必须稍微更改持久性存储协调器代码)。有点像:
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
...
}
所以,回答你的第一个问题。如果添加了新属性或关系,则需要创建新的托管对象文件。如果您所做的只是修改了预先存在的属性或关系的一些选项,那么您的旧托管对象文件仍然有效。
如果您还没有,您应该阅读Apple撰写的有关CoreData的所有内容。我还没有读过一本关于这个主题的书,它比在线文档更好。特别是,请在versioning and migration上阅读他们的信息。