NSFetchedResultsController谓词NOT过滤它的一部分(在同一个fechRequest的谓词中使用ANY,IN和BETWEEN)

时间:2011-07-25 16:43:51

标签: core-data entity-relationship nspredicate nsfetchedresultscontroller

我在这里搜索了很多,无法找到解决方案:

我有一个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,%@}子句不匹配。

任何人都可以帮我弄清楚我在这里缺少什么吗?

非常感谢! 丹尼尔

1 个答案:

答案 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值。这样会更快。