Iphone 特定版本的轻量级迁移后的自定义代码执行
我在核心数据中有两个对象模型(比如v1和v2)。此迁移符合轻型迁移的条件。现在,我想在迁移之后执行自定义代码,但仅当迁移从v1到v2时。稍后,如果我介绍v3,我不希望执行自定义代码 有办法做到这一点吗 提前感谢,,Iphone 特定版本的轻量级迁移后的自定义代码执行,iphone,ios4,core-data,core-data-migration,Iphone,Ios4,Core Data,Core Data Migration,我在核心数据中有两个对象模型(比如v1和v2)。此迁移符合轻型迁移的条件。现在,我想在迁移之后执行自定义代码,但仅当迁移从v1到v2时。稍后,如果我介绍v3,我不希望执行自定义代码 有办法做到这一点吗 提前感谢,, Anupam也许有更好的方法,买这个应该可以: 通过在核心数据中保留名为“Information”的实体并具有名为“CoreDataVersion”的属性来跟踪数据库版本 迁移代码完成后,添加代码以检查核心数据中的版本号 如果“CoreDataVersion”的值为“v1”,而您的应
Anupam也许有更好的方法,买这个应该可以: 通过在核心数据中保留名为“Information”的实体并具有名为“CoreDataVersion”的属性来跟踪数据库版本 迁移代码完成后,添加代码以检查核心数据中的版本号 如果“CoreDataVersion”的值为“v1”,而您的应用程序现在为“v2”(可以对每个版本进行硬编码),则执行附加的自定义代码,然后将新版本写回数据库
如果已经向用户发布了“v1”,只需说如果数据库中没有“CoreDataVersion”,那么它就是“v1”。在创建执行自动迁移的持久存储之前,请确定是否要迁移到版本2。如果愿意,请设置一个标志,以便在迁移发生后进行更改 要确定要从何处迁移,请执行以下操作:
NSString *path = [[NSBundle mainBundle] pathForResource:@"Model" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];
NSString *version = [managedObjectModel.versionIdentifiers anyObject];
版本标识符在Xcode中设置。另一种方法是执行从v1到v2的自定义数据迁移。从查看开始。以下是如何处理这种情况,基本上是使用商店的元数据,正如苹果工程师在WWDC 2010上建议的那样:
- 打开存储(使用迁移选项)
- 检查自定义密钥的元数据,例如“DonePostProcessing”
- 做后处理。。。
- 填充派生属性
- 插入或删除对象
- 设置存储元数据(“DonePostProcessing”=是)
- 保存更改和元数据
- (void)loadStoreWithMigration:(NSURL *)url {
...
store = [psc addPersistentStoreWithType: NSSQLiteStoreType configuration: nil URL: url options: opts error: &err];
m = [store metadata];
key = @”DonePostProcessing”;
if (m && ([[m objectForKey: key] integerValue] < 2) ){
[self doPostProcessingInContext: context];
m2 = [[m mutableCopy] autorelease];
[m2 setObject: [NSNumber numberWithInteger: 2] forKey: key];
[store setMetadata: m2];
ok = [context save:&err];
}
}
-(void)loadStoreWithMigration:(NSURL*)url{
...
store=[psc addPersistentStoreWithType:NSSQLiteStoreType配置:nil URL:URL选项:选项错误:&err];
m=[存储元数据];
key=@“DonePostProcessing”;
if(m&([[m objectForKey:key]integerValue]<2)){
[self-DoPostProcessingContext:context];
m2=[[m可变拷贝]自动释放];
[m2 setObject:[NSNumber NUMBER WITHINTEGER:2]forKey:key];
[存储集元数据:m2];
确定=[上下文保存:&错误];
}
}
另一个对我有效的解决方案:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSInteger currVersion = [defaults integerForKey:@"dataModelVersion"];
NSString *version = [managedObjectModel.versionIdentifiers anyObject];
if (currVersion == 0) {
[defaults setInteger:[version integerValue] forKey:@"dataModelVersion"];
}
else if (currVersion < [version integerValue]) {
NSLog(@"Migration Code");
[defaults setInteger:[version integerValue] forKey:@"dataModelVersion"];
}
NSUserDefaults*默认值=[NSUserDefaults standardUserDefaults];
NSInteger currVersion=[默认整数工作:@“dataModelVersion”];
NSString*版本=[managedObjectModel.versionIdentifiers anyObject];
如果(当前版本==0){
[默认设置setInteger:[版本integerValue]forKey:@“dataModelVersion”];
}
否则如果(当前版本<[version integerValue]){
NSLog(@“迁移代码”);
[默认设置setInteger:[版本integerValue]forKey:@“dataModelVersion”];
}
有人能帮帮我吗?上次我想做这样的事情,结果只是进行了一次自定义迁移。。。但通常情况下,如果只包含最后的自定义步骤,迁移的大部分可能是轻量级的,所以我喜欢这个问题。Bounty添加到这个问题是为了引起更多的注意,看看是否有人对此有一个好的答案。这对我来说是一个完美的解决方案,因为我有一个计算字段,每当我更改算法时都需要更新。谢谢
- (void)loadStoreWithMigration:(NSURL *)url {
...
store = [psc addPersistentStoreWithType: NSSQLiteStoreType configuration: nil URL: url options: opts error: &err];
m = [store metadata];
key = @”DonePostProcessing”;
if (m && ([[m objectForKey: key] integerValue] < 2) ){
[self doPostProcessingInContext: context];
m2 = [[m mutableCopy] autorelease];
[m2 setObject: [NSNumber numberWithInteger: 2] forKey: key];
[store setMetadata: m2];
ok = [context save:&err];
}
}
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSInteger currVersion = [defaults integerForKey:@"dataModelVersion"];
NSString *version = [managedObjectModel.versionIdentifiers anyObject];
if (currVersion == 0) {
[defaults setInteger:[version integerValue] forKey:@"dataModelVersion"];
}
else if (currVersion < [version integerValue]) {
NSLog(@"Migration Code");
[defaults setInteger:[version integerValue] forKey:@"dataModelVersion"];
}