0

母と子の 2 つのエンティティがあります。母にはそのプロパティがあり、子として NSSet があります。子にはそのプロパティがあり、それ以外には母親のプロパティがあります。したがって、関係 1-n があります。この時点で、マザーはすでに保存され、永続化されています。新しい子を挿入する必要があるため、次のコードを試します。

-(void)addChild:(NSString *)name {
    // get Child instance to save
        Child *child = (Child*) [NSEntityDescription insertNewObjectForEntityForName:@"Child" inManagedObjectContext:self.managedObjectContext];
        mother

        // get Mother element to associate
        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Mother" inManagedObjectContext:self.managedObjectContext];
        [request setEntity:entity];
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"mother_desc = %@", @"themothertofind"];
        [request setPredicate:predicate];

        id sortDesc = [[NSSortDescriptor alloc] initWithKey:@"mother_desc" ascending:YES];
        [request setSortDescriptors:[NSArray arrayWithObject:sortDesc]];

        NSError *error = nil;
        NSArray *fetchResults = [self.managedObjectContext executeFetchRequest:request error:&error];
        if (fetchResults == nil) {
            NSLog(@"%@", [error description]);
        }
        else {
        // id mother exist associate to Child
            [child setMother:[fetchResults objectAtIndex:0]];
            NSLog(@"Mother: %@", Child.mother.mother_desc);
        }


        [child setName:name];

        if (![self.managedObjectContext save:&error]) {
            NSLog(@"%@", [error description]);
        }
}

ログを使用すると、すべてのデータの一貫性がわかります。残念ながら、制約例外 (19) が発生します。CoreData がマザー オブジェクトを再度保存しようとした場合と同様です。
誰かがコードのどこにエラーがあるかを見ることができますか?

ありがとう!

@class Mother;

@interface Child : NSManagedObject

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) Mother *mother;

@end

@class Child;

@interface Mother : NSManagedObject

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSSet *children;
@end

@interface Mother (CoreDataGeneratedAccessors)

- (void)addChildrenObject:(Child *)value;
- (void)removeChildrenObject:(Child *)value;
- (void)addChildren:(NSSet *)values;
- (void)removeChildren:(NSSet *)values;

@end
4

2 に答える 2

1

子管理オブジェクトの母プロパティを設定するのではなく、子を親管理オブジェクトの子のセットに追加します。ただし、単にセットへの参照を取得して追加することはできないことに注意してください。適切なメソッドを使用する必要があります。

モデルを正しくセットアップしたと仮定すると、Mother 管理対象オブジェクトには、addChildObject: または addChildrenObject: の行に沿ったメソッドが必要です。

したがって、コードでは、次の行に沿って何かが見えます。

Mother *mother=[fetchResults objectAtIndex:0];
NSLog(@"mother:  %@, mother);
[mother addChildrenObject: child];
NSLog(@"Mother: %@", child.mother.mother_desc);

元の NSLog ステートメントを修正したことに注意してください。実際には、子オブジェクトのインスタンスではなく、クラスからの説明を求めていました。

いずれにせよ、マザー管理対象オブジェクトのメソッドを使用してその子セットに項目を追加すると、コア データは子のマザー プロパティの逆の関係もセットアップします。

幸運を。

ティム

于 2012-05-23T21:00:01.290 に答える
0

私は問題を見つけました:

テーブル zchild では、CoreData を使用せずにレコードを追加しました。

これにより、テーブル z_primarykey (CoreData によって自動生成されたテーブル) が更新されませんでした。具体的には、次の挿入に使用する次の ID を含む必要がある列 "z_max" があります。私の場合、これらの z_max は既にテーブルにある子の id と等しく、それは制約違反です。

于 2012-05-24T21:10:28.353 に答える