西海岸より

つらつらざつざつと

CoreDataで複数のデータモデルをマージして利用する方法

XcodeでCoreDataを用いる場合、データモデル(xcdatamodelの拡張子ファイル)を作成して、編集し、プログラム上から読み込むことになるが、複数のデータモデルをマージして、一つのManagedObjectContextとして扱いたいケースがある。

この場合、NSManagedObjectModelクラスのmergedModelFromBundlesメソッドを利用することで、簡単に実現可能。

- (NSManagedObjectModel *)managedObjectModel {

  if (managedObjectModel_ != nil) {
    return managedObjectModel_;
  }
  NSString *sampleBundlePath = [[NSBundle mainBundle] pathForResource:@"Sample.momd" ofType:@""];
  NSBundle *sampleBundle = [NSBundle bundleWithPath:sampleBundlePath];
  NSString *testBundlePath = [[NSBundle mainBundle] pathForResource:@"test.momd" ofType:@""];
  NSBundle *testBundle = [NSBundle bundleWithPath:testBundlePath];
  NSArray *bundleArray = [[NSArray alloc] initWithObjects:sampleBundle, testBundle, nil];

  // 複数バンドルを設定
  managedObjectModel_ = [[NSManagedObjectModel mergedModelFromBundles:bundleArray] retain];

  [bundleArray release];

  if (managedObjectModel_ == nil) {
    NSLog(@"%s managedObjectModel is %@", __func__, managedObjectModel_);
  }
  return managedObjectModel_;
}

二つのデータモデルに重複がある場合や、関連を持たせたい場合などは、まだ調査中。。