1

我有一个包含两个实体的简单应用程序:

人:

Attributes:
    name
Relationships:
    nativeLanguage: (<<-> Language.natives)
    nonNativeLanguage: (<<-> Language.nonNatives)

语:

Attributes:
    name
Relationships:
    natives: (<->> Person.nativeLanguage)
    nonNatives: (<->> Person.nonNativeLanguage)

在人员的编辑屏幕上,我设置了一个表格显示来列出为该人员列出的非母语,还有一个供他们选择另一种语言的下拉框和一个用于将新语言添加到列表中的按钮。

我的目标是创建如下函数:

- (IBAction)addNonNativeLanguage:(id)sender {
    // tack the language to the end of the list on a many-many relationship
    PersonEntry.nonNativeLanaguages = PersonEntry.nonNativeLanguages + sender;
}

并将动作附加到按钮上。诀窍是,虽然我知道如何分配和修改常规变量,但我不知道如何在 Interface Builder 之外修改 Core Data 的内容。我如何在 Objective-C 中做到这一点?

4

2 回答 2

2

在我所有的 Core Data 模型实体类中,我有以下用于对多关系操作的代码:

- (void)addNatives:(NSSet*)value_ {
    [self willChangeValueForKey:@"natives" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value_];
    [[self primitiveValueForKey:@"natives"] unionSet:value_];
    [self didChangeValueForKey:@"natives" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value_];
}

-(void)removeNatives:(NSSet*)value_ {
    [self willChangeValueForKey:@"natives" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value_];
    [[self primitiveValueForKey:@"natives"] minusSet:value_];
    [self didChangeValueForKey:@"natives" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value_];
}

- (void)addNativesObject:(Person*)value_ {
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value_ count:1];
    [self willChangeValueForKey:@"natives" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"natives"] addObject:value_];
    [self didChangeValueForKey:@"natives" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (void)removeNativesObject:(Person*)value_ {
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value_ count:1];
    [self willChangeValueForKey:@"natives" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"natives"] removeObject:value_];
    [self didChangeValueForKey:@"natives" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (NSMutableSet*)nativesSet {
    [self willAccessValueForKey:@"natives"];
    NSMutableSet *result = [self mutableSetValueForKey:@"natives"];
    [self didAccessValueForKey:@"natives"];
    return result;
}

此模板代码来自 Wolf Rentzsch 非常出色的mogenerator(它会在每次保存数据模型时自动适当地生成它)。

另外,请注意,多对多关系的核心数据后端是无序的。如果你想对你的数据保持秩序,你必须自己做。

于 2009-12-06T20:30:59.223 回答
1

您首先必须找到所需的 managedObject 实例/记录。快速而肮脏的方法是询问显示人员对象的界面元素它拥有哪个对象。

一旦有了对象,您就可以使用mutableSetValueForKey:关系名称调用该对象。这为您提供了所有相关语言的可变集合。然后,您获取正确的语言对象并使用标准 NSMutableSet 方法将其添加到集合中。

于 2009-12-06T16:10:27.713 回答