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

时间:2015-08-06 08:05:06

标签: ios core-data nspredicate

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

Event <<- EventPlayerState ->> Player

我试图找出一个事件是否已经通过EventPlayerState连接了播放器。

EventPlayerState表包含属性isActive,用于指示玩家是否在活动中处于活动状态。

我访问了事件关系属性hasEventPlayerStates。并尝试使用NSPredicate过滤它。但它总是返回错误。

    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 个答案:

答案 0 :(得分:2)

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

谓词也简单得多:

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

或检查特定事件

event.players.count == 0

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

相应的检查完全相同:

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