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

Anu*_*ole 12 iphone core-data core-data-migration ios4

我在Core Data中有2个对象模型(比如v1和v2).此迁移适用于轻量级迁移.现在,我希望在迁移后执行自定义代码,但仅在迁移从v1到v2时执行.稍后如果我介绍v3,我不希望自定义代码被执行.

有没有办法做到这一点?

在此先感谢,Anupam

Mas*_*aro 10

以下是如何处理这种情况,基本上是通过使用商店的元数据,正如Apple工程师在WWDC 2010上所建议的那样:

  • 打开商店(带迁移选项)
  • 检查自定义密钥的元数据,例如"DonePostProcessing"
  • 做后期处理......
    • 填充派生属性
    • 插入或删除对象
    • 设置商店元数据("DonePostProcessing"= YES)
  • 保存更改和元数据

或多或少,像



- (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];
   }

}
Run Code Online (Sandbox Code Playgroud)


Tal*_*key 1

可能有更好的方法,买这个应该有效:

通过在核心数据中保留名为“Information”的实体并具有名为“CoreDataVersion”的属性来跟踪数据库版本。

迁移代码完成后,添加代码以检查核心数据中的版本号。

如果“CoreDataVersion”的值为“v1”并且您的应用程序现在处于“v2”(这可以对每个版本进行硬编码),请执行其他自定义代码,然后将新版本写回数据库。

如果您已经向用户发布了“v1”,只需说如果数据库中没有“CoreDataVersion”,那么它就是“v1”。