核心数据:过滤多对可能与 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】:如果您没有在连接表中存储任何附加信息,那么连接两个实体的那个表是多余的。然后,您应该只在 Player
和 Event
之间建立多对多关系。
谓词也简单得多:
[NSPredicate predicateWithFormat:@"players.@count = 0"]
或检查特定事件
event.players.count == 0
如果您确实需要连接表,例如因为您要存储时间戳或其他信息,从 Event
的角度来看,它仍然看起来是一样的。
相应的检查是完全等价的:
[NSPredicate predicateWithFormat:@"playerStates.@count = 0"]
event.playerStates.count == 0
【讨论】:
感谢您的回答。但我在 EventPlayerState 中有其他属性。所以你的解决方案行不通。 :) 它们是什么?也许它们不是必需的。请将它们包含在您的问题中。 其实并没有什么区别。请参阅我修改后的答案。提供的解决方案应按说明工作。 好的,我会试试你的解决方案。目前我有一个解决方法,它使用一个属性 createdAt ,其中包含创建条目的时间戳。我认为这不是一个好的解决方案,但它确实有效。以上是关于核心数据:过滤多对可能与 NSPredicate 的关系的主要内容,如果未能解决你的问题,请参考以下文章