我在这里搜索了很多,无法找到解决方案:
我有一个TableViewController,它使用NSFetchedResultsController来显示来自CoreData的数据。
该模型有一个实体“Places”,它具有称为“类型”的多对多关系(以及反向关系,也与多对关系)。
在第一个TableViewController中,我显示实体“类型”中的对象(每个地方可以属于多个类型,一个类型可以有多个地方)。当用户点击一行时,它会调用一个新的TableViewController,它将使用NSFetchedResultsController显示与“Types”相关的实体“Places”中的对象。
我知道我可以使用:
NSSet = [aType valueForKey:@"Places"];
但是,我真的想使用NSFetchedResultsController及其所有好处。
好吧,在NSFetchedResultsController访问器方法中,我能够通过使用以下方式重新创建这种关系:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Places"
inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSDictionary *types = [NSDictionary dictionaryWithObjectsAndKeys:self.theTypes, @"TYPES", nil];
NSPredicate *predicateAny = [NSPredicate
predicateWithFormat:@"ANY types IN $TYPES"];
NSPredicate *predicate = [predicateAny predicateWithSubstitutionVariables:types];
此代码工作正常,因为它返回与我想要的“类型”相关的“位置”(那些被保存在属性theTypes中)。我在TableViewController中使用一个属性(theTypes)来保存在原始tableViewController中选择的所有“Types”对象。
问题是实体“Places”有一个名为“distance”的属性,我还需要将其用作NSPredicate中的过滤器,如下所示:
NSNumber *radious = [NSNumber numberWithDouble:10000.00];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"distance BETWEEN {0 , %@}", radious];
NSDictionary *types = [NSDictionary dictionaryWithObjectsAndKeys:self.theTypes, @"TYPES", nil];
NSPredicate *predicateAny = [NSPredicate
predicateWithFormat:@"ANY types IN $TYPES"];
NSPredicate *predicate = [predicateAny predicateWithSubstitutionVariables:types];
NSPredicate *thePred = [NSCompoundPredicate andPredicateWithSubpredicates:
[NSArray arrayWithObjects:predicate, pred, nil]];
[fetchRequest setPredicate:thePred];
以下是问题发生的地方:“距离”过滤器似乎被fetchRequest上的谓词忽略。结果提取的地方总是与@“距离BETWEEN {0,%@}子句不匹配。
任何人都可以帮我弄清楚我在这里缺少什么吗?
非常感谢! 丹尼尔
答案 0 :(得分:0)
这个谓词:
NSPredicate *predicateAny = [NSPredicate
predicateWithFormat:@"ANY types IN $TYPES",
radious];
没有意义,因为你没有在这个谓词中使用radious
变量。不确定这是否是问题的根源,但无论如何你应该清理它。
这个谓词:
NSPredicate *pred = [NSPredicate predicateWithFormat:@"distance BETWEEN {0 , %@}", radious];
......可能是:
NSPredicate *pred = [NSPredicate predicateWithFormat:@"distance <=%@", radious];
...除非你有可能具有负radious
值。这样会更快。