CoreData 获取嵌套对象

Posted

技术标签:

【中文标题】CoreData 获取嵌套对象【英文标题】:CoreData fetch nested objects 【发布时间】:2015-05-12 11:26:18 【问题描述】:

我有一个 json,其中包含每个对象都有子对象的对象,例如

[
    
        "id": 1,
        "name": "obj1"
    ,
    
        "id": 2,
        "name": "obj2"
    ,
    
        "id": 3,
        "name": "obj3",
        "child": 
            "id": 2,
            "name": "obj2"
        
    ,
    
        "id": 4,
        "name": "obj4",
        "child": 
            "id": 5,
            "name": "obj5"
        
    
]

因此,在核心数据中,我有实体 MyObject,它与子对象(与自身、一个)以及与父对象(与多个)相关

所以当我尝试通过谓词获取对象时

[NSPredicate predicateWithFormat:@"parent.@count = 0"]

我在 [1,3,4] 中只有 id 的对象,但没有 id = 2(这里是错误)和 id = 5(这里都是正确的)的对象,因为当它被映射时它被设置为父对象= 3 保存到数据库。

如果没有使用谓词,我得到 5 个对象,包括 obj5。

但我需要从 coredata 中获取我从 json 获得的对象的确切计数。

我只需要在 [1,2,3,4] 中获取 id 的对象。

如果可能,我需要如何编写谓词?

【问题讨论】:

所以您想获取***对象,而不是 JSON 中的嵌套项(这实际上与数据存储中哪些项是父项或子项无关)? 是的,只有***,但在 id=2 的基础对象中,现在作为第二级? 为什么错了,你没有得到 obj2?使用 obj3 将父对象添加到 obj2,因此它的父对象 count > 0 你不能在你当前的模型中预测它。您也许可以获得具有该详细信息的映射结果,甚至不确定,因为子项仍作为该键路径映射的一部分进行处理...为什么您需要***对象并且 JSON 中还有其他内容吗? 【参考方案1】:

您从 JSON 获得的数据是您所有对象的子集,但选择它的逻辑不会保留在您的对象模型中。

您保留子与父之间的关系(提示:为了便于阅读,如果它是多对多,请将其重命名为 parents),但您的 JSON 示例中的选择不基于任何这些标准。

获取所有对象的一种简单方法是提取 JSON 提要提供的*** id 并在谓词中使用它:

NSArray *ids = [jsonArray valueForKey:@"id"];
[NSPredicate predicateWithFormat:@"idNumber in %@", ids];

(请注意,我将您的属性名称从 id 更改为 idNumber 以避免可能的语言怪癖,因为 id 是保留字。)

【讨论】:

以上是关于CoreData 获取嵌套对象的主要内容,如果未能解决你的问题,请参考以下文章

iOS CoreData+MoGenerator:如何仅在使用嵌套上下文时初始化托管对象一次?

在串行队列上获取 CoreData 期间崩溃

如何从 CoreData 获取完整的对象(不是故障)?

使用 NSFetchedResultsController 更新 CoreData 对象

CoreData:获取具有给定属性和给定关系的对象?

CoreData(MagicalRecord) 获取保存的对象