0

データ モデルに複数のエンティティを持つ Core Data を利用するアプリケーションを構築しています。私がやりたいことは、NSString となるメソッドが受け取る名前に基づいて、NSManagedObject の適切なサブクラスを作成できるメソッドを作成することです。

私の方法は次のようになります。

- (NSManagedObject *) addEntity:(NSString *)name {

  NSManagedObjectContext *context = [self managedObjectContext];
  NSError *error;

  //need to add a line here that casts EntityType to of type "name" which is passed into the method.
  EntityType *testEntity = [NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:context];

  [context save:&error];

   return testEntity;

}

ここで、「EntityType」は「name」型であり、「Manager」という名前をメソッドに渡すと、「Manager」型のオブジェクトが作成されます。したがって、上記の行:

EntityType *testEntity = [NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:context];

読みます:

Manager *testEntity = [NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:context];

メソッドに渡すタイプに基づいてエンティティを動的に作成するには、どうすればよいですか? アプリケーションに 20 を超えるエンティティがあり、それらのいずれにも使用できるメソッドを 1 つだけにしたいので、これを行っていることに注意してください。

4

1 に答える 1

0

あなたの問題がtestEntity単にジェネリックを使用するタイプの場合NSManagedObject

とにかく良い解決策は、カテゴリを に追加することNSManagedObjectです。これは、基本的に MagicalRecord によって提供されるのと同じ機能を複製する実装です。

NSManagedObject+Utilities.h

@interface NSManagedObject (Utilities)
+ (instancetype)my_createAndSave:(NSError **)error;
@end

NSManagedObject+Utilities.m

@implementation NSManagedObject (Utilities)
+ (instancetype)my_createAndSave:(NSError **)error {
    NSString *entityName = NSStringFromClass(self);
    if ([self respondsToSelector:@selector(entityName)]) {
        entityName = [self performSelector:@selector(entityName)];
    }
    NSManagedObject *entity = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:self.managedObjectContext];
    [self.managedObjectContext save:error];
    return entity;
}
@end

いくつかの注意事項:

  • ネーミング:

    • カテゴリであることは、Apple の API と競合しないように、カスタム プレフィックスを追加するために常に推奨されます。ここで使用my_しましたが、好きなものを追加できます。
    • で始まるメソッド名は、new自動解放されていないオブジェクトを返すメソッドに予約する必要があります。は自動解放されるためentity、ARC はオブジェクトを返す前にエクストラを追加retainします (後で a によってバランスを取りますrelease) (参照)。これは問題ではありませんが、標準の命名規則に違反するため、避ける必要があります。
  • エラー処理

    • エラーを生成するか、適切に処理する必要があります。実装でエラーを呼び出し元に戻すことにしました
于 2013-10-23T18:25:25.420 に答える