Core data 谓词子查询通过匹配标记返回项

Core data 谓词子查询通过匹配标记返回项,core-data,tags,many-to-many,subquery,predicate,Core Data,Tags,Many To Many,Subquery,Predicate,我在两个实体之间有一种多对多的关系;项目和标签。我试图创建一个谓词来获取selectedItem,并根据它们有多少相似的标记返回项目的排名。到目前为止,我已经尝试: NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(itemToTag, $item, $item in %@).@count > 0", selectedItem.itemToTag]; 任何其他失败的迭代。它当前仅返回列表中的selec

我在两个实体之间有一种多对多的关系;项目和标签。我试图创建一个谓词来获取selectedItem,并根据它们有多少相似的标记返回项目的排名。到目前为止,我已经尝试:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(itemToTag, $item, $item in %@).@count > 0", selectedItem.itemToTag];
任何其他失败的迭代。它当前仅返回列表中的selectedItem。我在子查询上几乎找不到什么。有没有一位大师可以帮我完善这一点

提前感谢您的帮助

6月9日编辑

好消息是,有了Dan的代码,我可以用项目填充tableview!不幸的是排名数字是0

解决方案
我最初尝试按ID而不是名称搜索标记。注意“rankingExpressionDescriptionForTags”中的两个谓词选项:“我的标记没有唯一标识符,使用这两个选项中的第二个。谢谢你,丹

谓词只是开始。

首先看一看非常类似的问题。

假设您的模型有一个
标记
实体,在多对多关系中相关:
Item.tags
Tag.items

答案是:

- (NSExpressionDescription*) rankingExpressionDescriptionForTags:(NSSet*)tags
{
    NSPredicate* p = [NSPredicate predicateWithFormat:@"SUBQUERY(tags,$t,$t IN %@).@count > 0",tags];
    //if your tags are not unique (meaning you only like to match the names of tags)
    //change the predicate to:
    //p = [NSPredicate predicateWithFormat:@"SUBQUERY(tags,$t,$t.tagName IN %@).@count > 0",[tags valueForKey:@"tagName"]];
    NSExpression* rankExpresion = [(NSComparisonPredicate*)p2 leftExpression];
    NSExpressionDescription* rankExpDesc = [[NSExpressionDescription alloc] init];
    rankExpDesc.name = @"ranking";
    rankExpDesc.expression = rankExpresion;
    rankExpDesc.expressionResultType = NSInteger64AttributeType;
    return rankExpDesc;
}

- (NSExpressionDescription*) objectIDExpressionDescription
{
    NSExpressionDescription* expDesc = [[NSExpressionDescription alloc] init];
    expDesc.name = @"objectID";
    expDesc.expressionResultType = NSObjectIDAttributeType;
    expDesc.expression = [NSExpression expressionForEvaluatedObject];
    return expDesc;
}

- (NSFetchRequest*) rankingRequestForItem:(NSManagedObject*)item
{
    NSFetchRequest* r = [NSFetchRequest fetchRequestWithEntityName:@"Item"];
    NSPredicate* p = [NSPredicate predicateWithFormat:@"SELF != %@",item.objectID];
    r.resultType = NSDictionaryResultType;
    r.propertiesToFetch = @[[self objectIDExpressionDescription],
                            [self rankingExpressionDescriptionForTags:[item mutableSetValueForKey:@"tags"]]];
    r.predicate = p;
    return r;
}
注意:

  • 结果数组包含字典
  • (AFAIK)如果要按排名排序,则必须在获取后在内存中对生成的数组进行排序
  • 不能使用“获取结果”控制器来跟踪这些对象中的更改
  • 您可以使用FRC显示这些项目

  • 它看起来非常类似于,但有点精致。感谢您的回复。当我转到tableview时,应用程序关闭并返回“未解决的错误(null),(null)”。我还是个新手,可能会错过一些明显的东西。类似的报告问题可能指向managedobjectcontext。这里有我遗漏的东西吗?确切的错误信息是什么?添加一个异常断点,看看是哪一行导致了异常;如果(![[self-fetchedResultsController]performFetch:&error]){//更新以正确处理错误。NSLog(@“Unresolved error%@,%@”,error,[error userInfo]);退出(-1);我发现我从未输入过nsexpressiondescription。我已将其作为属性包含并合成了它。我需要输入什么?看起来您有另一个问题,您的
    fetchedResultsController
    可能返回
    nil
    。您需要将其包含在需要使用请求的位置。它不必是属性。