3

CoreDataを使用するアプリケーションがあります。プロジェクトに2つのデータモデルがあり、2つのモデルをマージしてManagedObjectContextを作成します。ここに私がそれを行うコードがあります:

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

エンティティの属性はいずれもオプションではなく、managedObjectContextを保存しようとするとアプリがクラッシュします。一部の属性が設定されていないためだと思います。親エンティティの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を作成するステートメントからステップスルーしました。

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

関連する場合と関連しない場合がある追加の事実:問題のあるエンティティを含むデータモデルを作成した後、Xcode機能を使用してクラスを自動的に作成しました。次に、モデルで他の方法を指定しなかったため、xcodeがクラスに複数形の名前を付けていることに気付きました(モデルでクラスを呼んでいたため)。そのため、「Entry.h」ではなく「Entries.h」になりました。戻ってすべてのクラスを手動で変更し、モデルでクラスの名前を指定しました。

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

4

2 に答える 2

1

awakeFromInsertオブジェクトが最初に作成されるときに、各オブジェクトに対して 1 回だけ呼び出されます。

必要なのはawakeFromFetch、ストアからメモリにロードされるたびに呼び出されるようにすることです。

多くの場合、両方の場所に同じまたは類似のコードが必要です。

于 2012-04-04T04:05:37.440 に答える
1

必死になって、データモデルと NSManagedObject クラスを削除しました。次に、モデルとクラスを再作成しました。

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

于 2012-04-04T05:02:28.710 に答える