我正在使用Core Data进行策略游戏。这个游戏的玩家有几个角色,可以分配给军队。角色与它所属的军队有多对多的关系,其中反之则是角色与军队的多对多关系。
我想阻止玩家反复向同一支军队分配角色。为此,当在视图控制器中制定一个获取请求以允许玩家选择要分配给当前陆军的角色时,我想过滤掉已经在军队中的所有角色。我现在拥有的是下面的内容。
NSFetchRequest* allCharacters = [[[NSFetchRequest alloc] init] autorelease];
[allCharacters setEntity: [NSEntityDescription entityForName: @"Character" inManagedObjectContext: _managedObjectContext]];
allCharacters.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey: @"name" ascending: YES]];
[allCharacters setPredicate: [NSPredicate predicateWithFormat: @"0 != SUBQUERY(armies, $element, $element.name like %@)", currArmy.name]];
_fetchedObjectController = [[NSFetchedResultsController alloc] initWithFetchRequest: allCharacters managedObjectContext: _managedObjectContext sectionNameKeyPath: nil cacheName: @"Armies"];
NSError* error;
[_fetchedObjectController performFetch: &error];
但是,此代码仅返回符合条件的一个角色。我试图谷歌问题,甚至找到一些可能有用的关于此命令的权威文档都失败了。我做错了什么 - 或者是否有更好的方法来做我想做的事情?
答案 0 :(得分:1)
LIKE
执行简单的通配符匹配(使用?
和*
作为通配符)。您可能希望与简单的==
进行比较。
SUBQUERY()
返回一组对象,通常与@count
一起使用
在谓语中。
您可以比较$element.name
,而不是将currArmy.name
与$element
进行比较
直接使用currArmy
。
以下谓词应该可以找到与不相关的所有对象 现任军队:
[NSPredicate predicateWithFormat: @"SUBQUERY(armies, $element, $element == %@).@count == 0", currArmy]
(仅需要SUBQUERY,因为NOT ANY
在核心数据中无法正常工作
谓词,比较Core Data NSPredicate with to-Many Relationship。)