Iphone 特定版本的轻量级迁移后的自定义代码执行

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”,而您的应

我在核心数据中有两个对象模型(比如v1和v2)。此迁移符合轻型迁移的条件。现在,我想在迁移之后执行自定义代码,但仅当迁移从v1到v2时。稍后,如果我介绍v3,我不希望执行自定义代码

有办法做到这一点吗

提前感谢,,
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"];
    }