我在CoreData模型版本中有各种各样的架构更改。由于本地架构只是网络数据的缓存,我很高兴删除sqlite文件并强制重新下载此版本的iOS应用程序。
...然而
数据库中有一个实体 由用户编写,不应丢失。
在新版本的应用程序中,此易变数据不再写入CoreData存储,而是记录在文件系统上。
我正在逐步进行,以便(例如)应用程序的2.0.1版本使用v1架构并复制数据,但没有中断架构更改,然后是应用程序的2.0.2版本可以添加架构更改并删除数据库,安全地知道数据已被删除但由于appstore更新的工作方式,它无法保证用户从.0-.1-.2开始。他们可能会直接从.0到.2并在尝试打开核心数据存储时遇到重大变化。
任何想法,指示,建议都赞赏。
更新:我想知道是否“假装”迁移可能是最佳选择。自定义迁移策略忽略除易失性数据之外的所有内容,并且实际上不会迁移它,只需将其写入文件系统即可。一旦运行,我将在文件系统中拥有易失性数据,并根据新架构获得空数据库。
答案 0 :(得分:0)
我也认为你伪造移植可能会更好,这里有一些代码可以让你想要的妈妈。只需将EntryModel替换为您的型号名称,然后调整版本即可。然后在NSPersistentStoreCoordinator上使用“ - (id)initWithManagedObjectModel”方法在您想要的模型上获取商店协调员。
- (NSManagedObjectModel *)managedObjectModelForVersion:(NSString*)version {
NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"EntryModel" ofType:@"momd"];
if (BETWEEN_INEX(version, @"1.0", @"1.4")) {
modelPath = [modelPath stringByAppendingPathComponent:@"EntryModel"];
modelPath = [modelPath stringByAppendingPathExtension:@"mom"];
} else if (BETWEEN_INEX(version, @"1.4", @"1.5")) {
modelPath = [modelPath stringByAppendingPathComponent:@"EntryModel 2"];
modelPath = [modelPath stringByAppendingPathExtension:@"mom"];
} else if (BETWEEN_INEX(version, @"1.5", @"1.6")) {
modelPath = [modelPath stringByAppendingPathComponent:@"EntryModel 3"];
modelPath = [modelPath stringByAppendingPathExtension:@"mom"];
} else if (BETWEEN_INEX(version, @"1.6", @"1.7")) {
modelPath = [modelPath stringByAppendingPathComponent:@"EntryModel 4"];
modelPath = [modelPath stringByAppendingPathExtension:@"mom"];
}
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
NSManagedObjectModel * oldManagedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
NSSet *vIdentifiers = [oldManagedObjectModel versionIdentifiers];
for (NSString * identifier in vIdentifiers) {
NSLog(@"Old Model : %@",identifier);
}
return [oldManagedObjectModel autorelease];
}
这也许有用:
#define GREATER_THAN(w,v) ([w compare:v options:NSNumericSearch] == NSOrderedDescending)
#define GREATER_THAN_OR_EQUAL_TO(w,v) ([w compare:v options:NSNumericSearch] != NSOrderedAscending)
#define LESS_THAN(w,v) ([w compare:v options:NSNumericSearch] == NSOrderedAscending)
#define LESS_THAN_OR_EQUAL_TO(w,v) ([w compare:v options:NSNumericSearch] != NSOrderedDescending)
#define BETWEEN_INCLUDE(w,v,z) (GREATER_THAN_OR_EQUAL_TO(w,v) && LESS_THAN_OR_EQUAL_TO(w,z))
#define BETWEEN_EXCLUDE(w,v,z) (GREATER_THAN(w,v) && LESS_THAN(w,z))
#define BETWEEN_INEX(w,v,z) (GREATER_THAN_OR_EQUAL_TO(w,v) && LESS_THAN(w,z))
#define BETWEEN_EXIN(w,v,z) (GREATER_THAN(w,v) && LESS_THAN_OR_EQUAL_TO(w,z))