代码之家  ›  专栏  ›  技术社区  ›  ern

当使用setvalue和数据已经存在时,如何在核心数据中正确设置关系

  •  5
  • ern  · 技术社区  · 16 年前

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

    我正计划使用 -setValue 方法在 Article 类以这样设置关系:

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

    问题是 value 不是一个 Category ,它只是一个包含类别标题的字符串(或字符串数组)。我当然可以在这个方法中为每个类别做一个查找并分配它,但是在一次处理一大堆文章时,这看起来效率很低。另一个选项是填充一个包含所有可能类别的数组,并只进行筛选,但我的问题是该数组存储在哪里?它应该是上的类方法吗 文章 ?是否有方法将附加数据传递到 -设置值 方法?有没有另一个更好的选择来建立我不想建立的关系?

    谢谢你的帮助。

    2 回复  |  直到 16 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

    为什么要实现setvalue:forkey:?您应该在这两个对象之间建立一个多对多的关系,并直接使用该关系。在这里看来,你做这件事很艰难。

    这段代码的最终目标是什么?

    更新

    如果我正确理解你,你有一个JSON数据块,你想把它转换成一个对象图,它与那个对象图相匹配,对吗?如果是,请看我在另一个答案中写的代码:

    JSON and Core Data on the iPhone

    在这个答案中,我将演示如何递归地构造和解构一个NSManagedObject图,并从JSON结构中构造和解构它。这比你现在走的路要容易得多。

        2
  •  2
  •   Adam Eberbach Adil Shaikh    16 年前

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

    当您填充一个对象时,您可能需要创建另一个;因此,当创建一个项目时,您需要检查核心数据存储中是否有正确类型的对象,如果该对象不存在,则创建它。当对象已经存在或刚刚创建时,可以将其分配给关系ivar类别*或将其添加到表示该关系的nsset*中。

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