Core data 谓词子查询通过匹配标记返回项
我在两个实体之间有一种多对多的关系;项目和标签。我试图创建一个谓词来获取selectedItem,并根据它们有多少相似的标记返回项目的排名。到目前为止,我已经尝试: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
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;
}
注意:它看起来非常类似于,但有点精致。感谢您的回复。当我转到tableview时,应用程序关闭并返回“未解决的错误(null),(null)”。我还是个新手,可能会错过一些明显的东西。类似的报告问题可能指向managedobjectcontext。这里有我遗漏的东西吗?确切的错误信息是什么?添加一个异常断点,看看是哪一行导致了异常;如果(![[self-fetchedResultsController]performFetch:&error]){//更新以正确处理错误。NSLog(@“Unresolved error%@,%@”,error,[error userInfo]);退出(-1);我发现我从未输入过nsexpressiondescription。我已将其作为属性包含并合成了它。我需要输入什么?看起来您有另一个问题,您的
fetchedResultsController
可能返回nil
。您需要将其包含在需要使用请求的位置。它不必是属性。