【问题标题】:How to properly set relationships in Core Data when using setValue and data already exists使用 setValue 且数据已存在时如何在 Core Data 中正确设置关系
【发布时间】:2011-03-01 11:49:37
【问题描述】:

假设我有两个对象:ArticlesCategories,两者之间存在多对多关系。对于本示例,所有相关类别都已添加到数据存储中。在遍历包含文章编辑的数据时,需要保存类别关系信息。

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

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

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

感谢您的帮助。

【问题讨论】:

    标签: iphone objective-c core-data


    【解决方案1】:

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

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

    更新

    如果我对您的理解正确,您有一个 JSON 数据块,并且您想将其转换为对象图并且它与该对象图匹配正确吗?如果是这样,请查看我在另一个答案中编写的代码:

    JSON and Core Data on the iPhone

    在该答案中,我展示了如何递归地构造和解构 NSManagedObject 图形与 JSON 结构之间的关系。这比你现在要走的路要容易得多。

    【讨论】:

    • Marcus,我确实已经建立了多对多关系。我有一大堆通过 JSON 更新的对象。我正在使用 -setValuesForKeysWithDictionary 方法更新每个对象。 JSON 包括类别的关系,所以我希望在一轮中完成所有更新。通过使用 -setValue 捕获输入,我计划将类别标题数组转换为适当的对象并分配关系。
    【解决方案2】:

    看起来您定义了 1:1 关系,因此您试图说该文章属于一个且仅属于一个类别。

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

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

    【讨论】:

    • 感谢 Adam,这实际上是多对多的关系。我会在问题中更清楚地说明这一点。我知道我需要进行查找,但我的问题是如何最好地做到这一点,通过方法中的 fetch 或检查所有可能类别的数组?
    • 我会做一个 fetch - 它不是重量级的,而且很容易让您的阵列与实际存储不同步。在商店中创建一个“CategoryCatalog”对象,您在创建它们时添加每个类别,这与获取几乎相同,因为它会生成错误并在您检查类别属性是否存在类别时自动获取当前文章。
    猜你喜欢
    • 2010-11-23
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多