使用Core Data的每个人都知道“用于打开商店的模型与用于创建商店的模型不兼容”的消息。
然后我必须从模拟器中删除我的应用程序,然后重新构建它。
我的问题是,如果我提交的应用程序v 1.0,然后在v 1.1中将一些实体添加到核心数据,这是否意味着更新为1.1的1.0用户将清除其数据?
答案 0 :(得分:1)
您需要为模型创建新的模型版本,然后迁移数据库。如果模型更改在所需更改范围内,则可以执行轻量级迁移。如果没有,您需要告诉核心数据如何迁移数据。查看迁移文档:http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreDataVersioning/Articles/Introduction.html
答案 1 :(得分:1)
在您的情况下,它听起来像是旧数据模型的简单扩展。如果你真的只是添加了一些新的实体甚至是新的类,那么所谓的轻量级迁移是正确的方法。
实际上在这种情况下,您几乎没有任何事情要做,但是将您的第二个模型创建为原始模型。重要的是,你有两个模型,然后应用程序只会加载你的第一个版本没有任何问题以及新版本。
不要忘记将新模型标记为新模型!
在创建新模型时要小心,因为删除模型真的很麻烦。
您的代码与此非常相似:
-(NSManagedObjectContext *)managedObjectContext {
if (managedObjectContext != nil) {
return managedObjectContext;
}
NSPersistentStoreCoordinator *lC = [self persistentStoreCoordinator];
if (lC != nil) {
managedObjectContext =[[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator: lC];
}
return managedObjectContext;
}
- (NSPersistentStoreCoordinator *) persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
// Allow inferred migration from the original version of the application.
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"DBName.sqlite"]];
NSError *error = nil;
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl
options:options error:&error]){
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
return persistentStoreCoordinator;
}
- (NSManagedObjectModel *) managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
return managedObjectModel;
}