核心数据:过滤多对可能与 NSPredicate 的关系

Posted

技术标签:

【中文标题】核心数据:过滤多对可能与 NSPredicate 的关系【英文标题】:Core Data: filter many to may relationship with NSPredicate 【发布时间】:2015-08-06 08:05:05 【问题描述】:

我需要过滤多对多关系。这意味着我有第三个表用于此连接。

Event <<- EventPlayerState ->> Player

我试图找出某个事件是否已经通过EventPlayerState 连接了玩家。

EventPlayerState 表包含属性 isActive 以指示玩家是否在活动中活跃。

我访问了事件关系属性hasEventPlayerStates。并尝试使用NSPredicate 对其进行过滤。但它总是返回 false。

    NSPredicate *seachPlayerPredicate = [NSPredicate predicateWithFormat:@"(hasPlayer = %@)", [player objectID]];

    NSSet *playerEventStates = [event hasPlayerEventStates];

    NSSet *filteredPlayer = [playerEventStates filteredSetUsingPredicate:seachPlayerPredicate];

    if([filteredPlayer count] == 1) 
        return YES;
    

    return NO; 

怎么了?还是有更好的方法?

【问题讨论】:

【参考方案1】:

如果您没有在连接表中存储任何附加信息,那么连接两个实体的那个表是多余的。然后,您应该只在 PlayerEvent 之间建立多对多关系。

谓词也简单得多:

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

或检查特定事件

event.players.count == 0

如果您确实需要连接表,例如因为您要存储时间戳或其他信息,从 Event 的角度来看,它仍然看起来是一样的。

相应的检查是完全等价的:

[NSPredicate predicateWithFormat:@"playerStates.@count = 0"]
event.playerStates.count == 0

【讨论】:

感谢您的回答。但我在 EventPlayerState 中有其他属性。所以你的解决方案行不通。 :) 它们是什么?也许它们不是必需的。请将它们包含在您的问题中。 其实并没有什么区别。请参阅我修改后的答案。提供的解决方案应按说明工作。 好的,我会试试你的解决方案。目前我有一个解决方法,它使用一个属性 createdAt ,其中包含创建条目的时间戳。我认为这不是一个好的解决方案,但它确实有效。

以上是关于核心数据:过滤多对可能与 NSPredicate 的关系的主要内容,如果未能解决你的问题,请参考以下文章

用于多对多关系的 NSPredicate 过滤器

如何按不相关的实体过滤核心数据

核心数据:NSPredicate 一对多对多关系

核心数据 - 从多对多关系构建 NSPredicate

具有多对多关系的核心数据 NSPredicate

CoreData:使用 NSPredicate 过滤一对多对多关系(此处不允许错误对多键)