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:如何仅在使用嵌套上下文时初始化托管对象一次?