我有两个实体:母亲和孩子。 母亲有它的属性和其他NSSet作为孩子。 孩子拥有它的财产和其他母亲财产。 所以有关系1-n: 现在,母亲已经得救并且坚持不懈 d。我需要插入一个新的孩子,所以我尝试使用代码:
-(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尝试再次保存Mother对象一样 有人可以看到代码中的错误在哪里?
谢谢!
@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
答案 0 :(得分:1)
不是设置子管理对象的母属性,而是将子项添加到母管理对象的子集。但请注意,您不能简单地获取对该集的引用并添加它,您需要使用适当的方法。
母管理对象,假设您正确设置模型,应该有一个类似于addChildObject:或addChildrenObject的方法:。
所以在代码中会看到以下几行:
Mother *mother=[fetchResults objectAtIndex:0];
NSLog(@"mother: %@, mother);
[mother addChildrenObject: child];
NSLog(@"Mother: %@", child.mother.mother_desc);
请注意,我对您原来的NSLog语句进行了更正。实际上,您实际上是要求类中的描述,而不是子对象的实例。
无论哪种方式,当使用Mother管理对象的方法将项目添加到其子集时,Core数据也将设置孩子母亲属性的反向关系。
祝你好运。添
答案 1 :(得分:0)
我发现了问题:
在zchild表中,我添加了不使用CoreData的记录。
这导致表z_primarykey(CoreData自动生成的表)未更新。具体而言,有一列“z_max”必须包含下一个用于下一次插入的id。在我的情况下,那些z_max等于已经在表中的子的id,这是约束违规。