核心数据不会覆盖对象

时间:2014-02-07 11:48:51

标签: ios objective-c core-data

我的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只保存了与创建的新联系人的关系!!。

示例:

  1. 创建Contact1并保存在Group1中。
  2. 创建Contact2并保存在Group1中。
  3. 现有Contact1并保存在Group2中。
  4. 创建Contact3并保存在Group2中。
  5. 如果我在我的应用程序运行时检查核心数据,我将在Group1(Contact1,Contact2)和Group2(Contact1,Contact3)中。

    然后我重新启动应用程序并再次检查Core Data,现在我已经在Group1(Contact1,Contact2)和 Group2(Contact3) !! Core Data已经失去了Contact1和Group2之间的关系,每当我在一个组和现有联系人之间建立关系时就会发生这种情况。

    我做错了什么?

    非常感谢!

1 个答案:

答案 0 :(得分:4)

您应该使用“Editor - > Create NSManagedObject”为您的实体创建类文件 子类......“来自Xcode菜单。多对多关系由NSSet表示, 不是NSMutableSet,因此您无法通过添加对象直接修改它。

完成后,您可以使用

group.members添加其他对象
[group addMembersObject:contact];

或者

[contact addMemberGroupsObject:group];

核心数据会自动更新反向关系,因此无关紧要 你选择哪一个。