使用setValue和数据时,如何在Core Data中正确设置关系

时间:2010-06-09 04:29:16

标签: iphone objective-c core-data

假设我有两个对象:文章类别,两者之间有很多关系。为了这个例子,所有相关的类别都已添加到数据存储中。循环浏览包含文章编辑的数据时,需要保存类别关系信息。

我打算在-setValue类中使用Article方法来设置这样的关系:

- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
    if([key isEqualToString:@"categories"]){
        NSLog(@"trying to set categories...");
    }
}

问题是value不是Category,它只是一个包含类别标题的字符串(或字符串数​​组)。我当然可以在这个方法中为每个类别进行查找并分配它,但是在一次处理大量文章时这似乎效率低下。另一种选择是填充所有可能类别的数组并只过滤,但我的问题是存储该数组的位置?它应该是Article上的类方法吗?有没有办法将其他数据传递给-setValue方法?是否有另一个更好的选择来设定我没想到的关系?

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

为什么要实现setValue:forKey:?您应该在这两个对象之间建立关系,这些对象设置为多对多,并直接使用该关系。在这看来你正在努力做到这一点。

此代码的最终目标是什么?

更新

如果我理解正确,你有一大堆JSON数据,你想把它变成一个对象图,它匹配那个对象图是否正确?如果是这样,请查看我在其他答案中写的代码:

JSON and Core Data on the iPhone

在该答案中,我展示了如何以递归方式构造和解构与JSON结构相关的NSManagedObject图形。它比你现在要走的道路要容易得多。

答案 1 :(得分:2)

看起来你定义了一个1:1的关系,所以你试图说这篇文章属于一个且只属于一个类别。

当您填充一个对象时,您可能需要创建另一个对象;因此,在创建文章时,您需要检查核心数据存储中是否有正确类型的对象,如果它不存在,则创建它。当您拥有预先存在或刚刚创建的对象时,您可以将(它的关系)分配给关系ivar Category *或(多个关系)将其添加到表达关系的NSSet *。

所以是的,您确实需要查找并分配实际对象,因为您必须在托管对象上下文中创建与对象的关系,如果它不存在,则必须在创建该关系之前创建它。 / p>