CoreDataでエンティティを継承させる。

エンティティの継承

※2013/06/20 エンティティの継承における懸念を追記
CoreDataで複数Entityを作ったときにAttributeが重複することがあります。
下の場合、Attributeのageとnameが重複しています。
差分もわかりづらく、繰り返し同じことを書かなければいけないので作業効率も悪いです。



この場合、エンティティの継承を使えば共通のAttributeを親Entityに用意して、
子供Entityはそれを受け継ぎ、以下の様に重複部分をなくすことができます。


以下が手順です。
まずは新しくEntityを追加し「Animal」という名前をつけます。
そして、ageとnameのAttributeを「Animal」に追加します。



「CONFIGURATION」からAnimalの「abstract」にチェックをします。
これでAnimalが抽象エンティティになります。


次に「Person」と「Pet」の親エンティティを「Animal」に設定します。



この状態だと親がもつAttributeと子がもつAttributeが衝突してしまいます。



なので子の「age」、「name」を削除します。



これで「Person」「Pet」それぞれ特有のAttributeだけが残り整理されました。


実際のコードでは以下のようにアクセスすることができます。

#import "Pet.h"
#import "Person.h"
@implementation CoreTestAppDelegate

@synthesize window = _window;
@synthesize managedObjectContext = __managedObjectContext;
@synthesize managedObjectModel = __managedObjectModel;
@synthesize persistentStoreCoordinator = __persistentStoreCoordinator;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    
    NSManagedObjectContext *moc = self.managedObjectContext;
    Pet *pet = [NSEntityDescription insertNewObjectForEntityForName:@"Pet" inManagedObjectContext:moc];
    pet.name = @"jon";
    pet.ownerName = @"papasan";    
    pet.age  = [NSNumber numberWithInt:4];
    
    [self saveContext];
    

    NSFetchRequest *r = [[NSFetchRequest alloc] initWithEntityName:@"Pet"];
    NSError *e = nil;
    NSArray *results = [moc executeFetchRequest:r error:&e];
    
    for (Pet *pet in results) {
        NSLog(@"%@",pet.name);
        NSLog(@"%@",pet.age);        
    }
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

※エンティティの継承における懸念

Topに戻る
CoreDataのエンティティの継承とクラスの継承とは似て非なるものです。
エンティティを継承すると親エンティティのテーブルに子エンティティの全属性を入れたビックテーブルが作られます。
少量のデータでは問題になりませんが、データ量によってはNullの箇所が増え検索時のパフォーマンスに影響を与える可能性があります。
例)[子エンティティの属性を全て持つAnimalテーブル]

Z_PK Z_ENT Z_OPT ZAGE ZNAME ZJOB ZOWNERNAME
1 2 1 4 jon [Null] papasan
2 2 1 5 chappy [Null] mamasan
3 3 1 21 tom programmer [Null]