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

iPhone核心数据-通过多种关系访问深层属性

  •  1
  • Nate  · 技术社区  · 14 年前

    假设我有一个实体用户,它与实体菜单有一对多关系,而实体菜单与实体餐有一对多关系,实体餐与实体配方有多对一关系,实体配方与实体元素有一对多关系。 我要做的是选择属于特定用户(username=myusername)和特定菜单的元素 S (mindate<menu.date<maxdate)。

    有人知道如何得到它们吗?

    谢谢

    1 回复  |  直到 14 年前
        1
  •  2
  •   Barry Wark    14 年前

    要对元素实体执行提取操作。从你的描述来看,还不清楚你是否定义了反向关系 1 (例如,要接收的元素)以及它们是对多的还是对一的。假设您已经定义了它们,并且它们是对一的,那么您可以使用类似[2]的谓词进行提取:

    [NSPredicate predicateWithFormat:@"%@ > recipe.meal.menu.date && recipie.meal.menu.date < %@ && recipie.meal.menu.user.username LIKE[cd] %@", minDate, maxDate, myUsername];
    

    我已经用过 LIKE[cd] 用于对usename进行不区分大小写和不区分音调符号的比较。还要注意,核心数据将日期存储为双精度 NSTimeInterval ,没有时区信息。如果你想做时区敏感的日期比较,你需要做更多的工作。

    如果你还没有定义逆关系, 做它 . 正如在其他地方多次提到的,核心数据是一个图形管理框架,恰好能够将其图形持久化到磁盘上。如果您定义了反向关系,它将做大量的幕后工作来为您自动维护引用完整性。特别是对于多对多关系,核心数据实际上需要反向才能使事情正常工作。

    [2]如果你已经定义了许多我假定为1的反义词,你将不得不使用稍微复杂一点的谓词。例如,第一个子句是

    @"ANY (@unionOfSets.recipe.meal.menu.date) < %@"
    

    (最后一位未经测试;kvo set操作符总是对我进行一些试验)。你可以阅读 set and array KVO算子