谓词只返回一个对象

时间:2013-11-16 03:43:24

标签: objective-c core-data nspredicate

我正在使用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];

但是,此代码仅返回符合条件的一个角色。我试图谷歌问题,甚至找到一些可能有用的关于此命令的权威文档都失败了。我做错了什么 - 或者是否有更好的方法来做我想做的事情?

1 个答案:

答案 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。)