Ric*_*kiG 50 iphone data-migration core-data
当我向核心数据模型添加新属性时,我想让我的应用程序能够进行自动轻量级迁移.
在Apple的指南中,这是我能找到的主题的唯一信息:
自动轻量级迁移
要请求自动轻量级迁移,请在addPersistentStoreWithType中传递的选项字典中设置适当的标志:configuration:URL:options:error:.您需要将与NSMigratePersistentStoresAutomaticallyOption和NSInferMappingModelAutomaticallyOption键对应的值设置为YES:
NSError *error;
NSURL *storeURL = <#The URL of a persistent store#>;
NSPersistentStoreCoordinator *psc = <#The coordinator#>;
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
if (![psc addPersistentStoreWithType:<#Store type#>
configuration:<#Configuration or nil#> URL:storeURL
options:options error:&error]) {
// Handle the error.
}
Run Code Online (Sandbox Code Playgroud)
我NSPersistentStoreCoordinator
以这种方式初始化:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"FC.sqlite"]];
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;
}
Run Code Online (Sandbox Code Playgroud)
我无法看到我应该在何处以及如何添加Apple代码以使自动轻量级迁移工作?
wil*_*lli 93
这就是我做的自动轻量级迁移(来源:http://brainwashinc.wordpress.com/2010/01/18/iphone-coredata-automatic-light-migration/)
将persistentStoreCoordinator创建更改为此(替换YOURDB):
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"YOURDB.sqlite"]];
// handle db upgrade
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
// Handle error
}
return persistentStoreCoordinator;
}
Run Code Online (Sandbox Code Playgroud)
选择你的xcdatamodel文件设计 - >数据模型 - >添加模型版本(展开你的xcdatamodeld项目)选择"2"(或更高版本)文件,设计 - >数据模型 - >设置当前版本(编辑此版本)
将您的managedObjectModel实现更改为此(替换YOURDB)
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
NSString *path = [[NSBundle mainBundle] pathForResource:@"YOURDB" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];
return managedObjectModel;
}
Run Code Online (Sandbox Code Playgroud)
起初,上述解决方案对我不起作用.返回的managedObjectModel为0x0.我想这是因为我重命名了不同模型文件的文件名.如果您按照上面的说明进行信件,那么一切正常.
但是,如果您确实更改了模型文件名,那么您可以手动选择"当前"模型文件:让我们说您的原始模型文件是MYMODEL.xcdatamodel之后执行上面的添加模型步骤变成一个目录MY.xcdatamodeld而在它下面你有MYMODEL.xcdatamodel和MYMODEL 2.xcdatamodel将新模型文件重命名为您想要的任何内容,例如,假设您已将空格删除到MYMODEL2.xcdatamodel并编辑其内容.现在在上面的代码中做了
NSString *path = [mainBundle pathForResource:@"MYMODEL2" ofType:@"mom" inDirectory:@"MYMODEL.momd"];
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
22433 次 |
最近记录: |