代码之家  ›  专栏  ›  技术社区  ›  Benjamin Ortuzar

具有多对多关系的CoreData nsPredicate

  •  2
  • Benjamin Ortuzar  · 技术社区  · 16 年前

    我已经建立了个人/标签关系模型。这是一种多对多关系;一个人可以有多个标签,一个标签可以与多个人关联。

    我正在尝试运行一个查询,以查看是否获得一个人员列表,该列表已用一组标记的每个标记进行了标记。例如:每个被标记为“foo”和“bar”的人。

    这就是我一直在尝试但没有成功的代码。

    NSPredicate *attributePredicate = [NSPredicate predicateWithFormat: 
                                           @"ALL personTags.tagName in %@", filtersArray];
    [subPredicates addObject:attributePredicate];;
    

    有办法解决这个问题吗?我使用sqllite作为持久存储。 我在数据库中有大约2000个人,大约100个不同的标签,只有少数人会同时应用这些标签。

    1 回复  |  直到 15 年前
        1
  •  6
  •   Eimantas    15 年前

    反向查询并请求“self in%@”标记,然后可以对生成的数组执行kvc操作,如:

    NSArray *array = [results valueForKeyPath:@"@distinctUniionOfArrays.person"];
    

    这将为您提供所需的结果。请注意,这是我的iPad上打印出来的,所以可能会出现打字错误。

    请参阅有关此主题的文档

    http://developer.apple.com/mac/library/iPad/index.html#documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/ArrayOperators.html

    更新

    对不起,我误解了这个问题。我建议尝试使用子查询。如果无法访问数据结构,则很难测试该结构以使其完全正确,但此代码应将您置于正确的路径上:

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@"Person" inManagedObjectContext:moc]];
    [request setPredicate:[NSPredicate predicateWithFormat:@"(SUBQUERY(self.tags, $tag, ALL $tag.name in %@).count > 0)", tagNameArray]];
    
    NSError *error = nil;
    NSArray *results = [moc executeFetchRequest:request error:&error];
    NSAssert2(error == nil, @"Error fetchings tags: %@\n%@", [error localizedDescrption], [error userInfo]);