【问题标题】:Core Data modeling of relationships关系的核心数据建模
【发布时间】:2011-03-01 00:08:34
【问题描述】:

我正在 Core Data 中为我的应用程序建模。我有一个名为“stats”的对象,它将有一个与每个对象相关联的“玩家”、“团队”和“游戏”。一旦存储了这些统计数据对象,我想通过这些属性中的任何一个或多个(玩家、团队、游戏)来查询它们。请参阅下面的模型。

问题 1:将这些建模为“关系”而不是“属性”是否有意义。

问题 2:在检索时,我想使用对象来形成我的 NSPredicate,而不必跟踪每个玩家、团队或游戏的唯一 ID 名称。如果我将玩家、团队和游戏对象(而不是唯一的 ID 或名称)与每个实体一起存储,那么检索它们的最佳方法是什么。如果我想检索特定“团队”(someTeamObject)的所有统计数据对象,或者我需要通过 ObjectID 进行查询,以下操作是否有效?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"team == %@", someTeamObject];

谢谢

【问题讨论】:

    标签: iphone ipad core-data


    【解决方案1】:
    1. 如果我理解你的问题,是的,将它们建模为具有它们之间关系的单独对象是有意义的。它在获取各种对象时特别有用;例如,您可以获取与给定统计数据关联的单个玩家,或获取游戏的所有统计数据。这就引出了你的第二个问题:

    2. 不要使用谓词,注意你的关系有名字;您可以调用相关的访问器方法,而不是使用关联的 NSPredicate 构建完整的 NSFetchRequest。对于获取 Team 的所有 Stat 对象的请求,您只需调用 [team stats] 即可返回 Stat 对象的 NSArray。

    【讨论】:

    • 谢谢蒂姆。 WRT 回答 2,是的,我现在可以根据您的示例访问团队的所有统计数据,并且由于我与 stats 对象中的“玩家”和“游戏”有反向关系,我想我可以通过循环进一步完善该数组通过每个对象并测试这些对象。我担心的是 [team stats] NSSet 可能非常大,并且会被加载到内存中以进行其他测试。有没有更有效的方法来做到这一点?例如,让数据库而不是客户端来完成工作?事实是有更多的属性可以过滤(保持简单)
    • JMH:我建议阅读有关故障的内容,尤其是在核心数据编程指南和 NSManagedObject 类参考中。值得注意的是,您可以在托管对象上调用isEqual: 而不会引发错误,这使您可以在不需要大量内存的情况下迭代该集合。但是,如果您需要访问每个托管对象的属性,那么您是对的 - 使用 NSPredicate 构建获取请求来完成工作可能更有效。在这种情况下,我相信您的原始示例可以使用 == 比较。
    • Tim,Core Data Programming Guide 中的故障信息是对的。谢谢。我想我会在大多数情况下使用 NSPredicates 来完成这项工作。我想保持原始问题中定义的关系不会有什么坏处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    相关资源
    最近更新 更多