我的Core Data存在问题。我有一个名为“Group”的实体,还有一个名为“Contact”的实体。这些实体之间存在“多对多”的关系,因为一个组可以有多个联系人(组的成员),一个联系人可以有多个组(成为许多组的成员)。
所以,这就是关系:
组<< ----->>接触
我需要的是插入联系人(新的或现有的)作为现有组的成员。 我的问题是什么?嗯...如果我创建一个新联系人,我可以插入它们,但如果联系人已经存在,Core Data不会覆盖并保存它。
这是我的代码:
- (void)saveMemberInGroup:(Message *)message
{
GroupInfo *groupInfo = message.group;
UserInfo *member = message.user;
AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = [app managedObjectContext];
NSError *error;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:CONTACT_ENTITY
inManagedObjectContext:context];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"ident == %@", [member ident]]];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
//Here I check if the contact exists.
Contact *contact;
if ([fetchedObjects count] == 0) {
contact = [NSEntityDescription insertNewObjectForEntityForName:CONTACT_ENTITY
inManagedObjectContext:context];
[contact setIdent:[NSString stringWithFormat:@"%@", [member ident]]];
} else {
contact = [fetchedObjects objectAtIndex:0];
}
//Now I make a new request for the group.
fetchRequest = [[NSFetchRequest alloc] init];
entity = [NSEntityDescription entityForName:GROUP_ENTITY
inManagedObjectContext:context];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"ident == %@", [groupInfo ident]]];
[fetchRequest setEntity:entity];
fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
Group *group = [fetchedObjects objectAtIndex:0];
//Now, I overwrite the group and the contact.
[[group members]addObject:contact];
[[contact memberGroups]addObject:group];
[context save:&error];
}
这是我的集团实体:
@interface Group : NSManagedObject
@property (nonatomic, retain) NSString *ident;
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSMutableSet *members;
@end
我的联系人实体:
@interface Contact : NSManagedObject
@property (nonatomic, retain) NSString *ident;
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSMutableSet *memberGroups;
@end
注意:
这真的很奇怪...当我检查是否已成功更新对象时,一切似乎都没问题,组和联系人都正确更新了NSSet,但是当我重新启动应用程序时(我的意思是,完成并开始)再次,或在XCode中按“播放”),Core Data只保存了与创建的新联系人的关系!!。
示例:
如果我在我的应用程序运行时检查核心数据,我将在Group1(Contact1,Contact2)和Group2(Contact1,Contact3)中。
然后我重新启动应用程序并再次检查Core Data,现在我已经在Group1(Contact1,Contact2)和 Group2(Contact3) !! Core Data已经失去了Contact1和Group2之间的关系,每当我在一个组和现有联系人之间建立关系时就会发生这种情况。
我做错了什么?
非常感谢!
答案 0 :(得分:4)
您应该使用“Editor - > Create NSManagedObject”为您的实体创建类文件
子类......“来自Xcode菜单。多对多关系由NSSet
表示,
不是NSMutableSet
,因此您无法通过添加对象直接修改它。
完成后,您可以使用
向group.members
添加其他对象
[group addMembersObject:contact];
或者
[contact addMemberGroupsObject:group];
核心数据会自动更新反向关系,因此无关紧要 你选择哪一个。