2012-04-04 3 views
2

私はコアデータを使用するアプリケーションを持っています。私はプロジェクトに2つのデータモデルを持っており、2つのモデルをマージしてManagedObjectContextを作成します。ここで私はそれを行うコード:私は私のmanagedObjectContextを保存しようとすると、私のエンティティの属性のawakeFromInsertは決して呼ばれません

- (NSManagedObjectModel *)managedObjectModel { 
    if (__managedObjectModel != nil) { 
     return __managedObjectModel; 
    } 

    NSURL* entityURL = [[NSBundle mainBundle] URLForResource:@"User_data" withExtension:@"momd"]; 
    NSManagedObjectModel* entityModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:entityURL]; 

    NSURL* whoURL = [[NSBundle mainBundle] URLForResource:@"WHO_data" withExtension:@"momd"]; 
    NSManagedObjectModel* whoModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:whoURL]; 

    NSArray* models = [NSArray arrayWithObjects:entityModel, whoModel, nil]; 
    __managedObjectModel = [NSManagedObjectModel modelByMergingModels:models]; 

    return __managedObjectModel; 
} 

なしオプションで、私のアプリがクラッシュしません。私はこれが、属性のいくつかが設定されていないためだと考えています。私はawakeFromInsertをオーバーライドしている:親エンティティのために:

- (void) awakeFromInsert 
{ 
    [super awakeFromInsert]; 

    NSString* userCFUUID = [[NSUserDefaults standardUserDefaults]objectForKey:@"device_identifier"]; 

    if (userCFUUID) { 
     [self cfuuid:userCFUUID]; 
    } else { 
     [NSException raise:NSInvalidArgumentException format:@"Entry: awakeFromInsert: cannot find CFUUID"]; 
    } 

    [self setCreationDate:[NSDate date]]; // the time since Jan 1st 1970 in seconds 
    [self setEventDate:[NSDate date]]; 
} 

しかしawakeFromInsertは:呼び出されることはありません。私は、ブレークポイントを設定し、私はNSManagedObjectを作成する声明からを通じて強化しました:かのrelaventであってもなくてもよい

LengthEntry *length1 = [NSEntityDescription insertNewObjectForEntityForName:@"LengthEntry" inManagedObjectContext:moc]; 

追加事実: 問題のエンティティを含むデータモデルを作成した後、私はXcodeの機能を使用しました自動的にクラスを作成します。私はそれから、モデルで別途することを指定していなかったので、xcodeは複数の意味でクラスを指定していたことを認識しました(これはモデルで呼び出されたものです)。だから、私は "Entry.h"の代わりに "Entries.h"で終わった。私は戻って、手動ですべてのクラスを変更し、モデル内でクラスの名前を指定しました。

awakeFromInsertが呼び出されない理由を理解する必要があります。

答えて

1

私はデータモデルとNSManagedObjectクラスを削除しました。私はモデルとクラスを再作成しました。

今、動作します。手動でクラスの名前を変更したときに何かが起こったに違いありません。

+6

私は2セントでスローするつもりですが、これは、エディタ内のエンティティにクラスを追加することが忘れられたときに起こるのが一般的です。これにより、カスタム実装が使用されることはありませんが、エンティティ定義でコアデータがオブジェクトストアに分割されます。 – Landern

+1

@Moses、私にとっては、実際には、子エンティティのクラスを設定することを忘れていました。ありがとう! – phatmann

1

awakeFromInsertは、オブジェクトが最初に作成されたときに、オブジェクトごとに1回だけ呼び出されます。

awakeFromFetchは、ストアからメモリにロードされるたびに呼び出されるようにします。

何度も、同じ場所または同じ場所に同じコードが必要です。

関連する問題