Core data NSFetchedResultsController谓词未筛选其中的一部分(在同一fechRequest的谓词中使用ANY、IN和BETWEEN)

Core data NSFetchedResultsController谓词未筛选其中的一部分(在同一fechRequest的谓词中使用ANY、IN和BETWEEN),core-data,entity-relationship,nspredicate,nsfetchedresultscontroller,Core Data,Entity Relationship,Nspredicate,Nsfetchedresultscontroller,我在这里搜索了很多,找不到解决我的问题的方法: 我有一个TableViewController,它使用NSFetchedResultsController显示CoreData中的数据 该模型有一个实体“位置”,它有一个称为“类型”的多对多关系(和一个反向关系,也是多对多关系) 在第一个TableViewController中,我显示实体“类型”中的对象(每个位置可以属于多个类型,一个类型可以有多个位置)。当用户点击一行时,它将调用一个新的TableViewController,该控制器将使用NS

我在这里搜索了很多,找不到解决我的问题的方法:

我有一个TableViewController,它使用NSFetchedResultsController显示CoreData中的数据

该模型有一个实体“位置”,它有一个称为“类型”的多对多关系(和一个反向关系,也是多对多关系)

在第一个TableViewController中,我显示实体“类型”中的对象(每个位置可以属于多个类型,一个类型可以有多个位置)。当用户点击一行时,它将调用一个新的TableViewController,该控制器将使用NSFetchedResultsController显示与“类型”相关的实体“位置”中的对象

我知道我可以用:

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中使用一个属性(Types)来保存在原始TableViewController中选择的所有“类型”对象

问题是实体“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];
问题出现在这里:“距离”过滤器似乎只是被请求时的谓词忽略了。结果获取的位置始终与{0,%@}子句之间的@“距离”不匹配

有人能帮我找出我在这里遗漏了什么吗

非常感谢! 丹尼尔

这个谓词:

NSPredicate *predicateAny = [NSPredicate 
                             predicateWithFormat:@"ANY types IN $TYPES", 
                             radious];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"distance BETWEEN {0 , %@}", radious];
没有意义,因为您在此谓词中没有使用
radious
变量。不确定这是否是问题的根源,但无论如何您都应该清理它

这个谓词:

NSPredicate *predicateAny = [NSPredicate 
                             predicateWithFormat:@"ANY types IN $TYPES", 
                             radious];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"distance BETWEEN {0 , %@}", radious];
…可能是:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"distance <=%@", radious];

NSPredicate*pred=[NSPredicate predicateWithFormat:@“距离谢谢TechZen!但是你是对的,无线电的东西是一个打字错误(我编辑了原始帖子以避免再次出错)。关于你的第二次观察,是的,我需要测试0下的值,所以{0,%@}部分很重要…看起来距离参数必须是哑参数。我的意思是,代码必须首先计算所有coreData条目的距离,并且只能在谓词中使用。这样比较才会起作用。我的数据模型的构建方式距离字段有自定义的访问器方法来计算距离给定的坐标。我不能在谓词和获取期间这样做。此字段(距离)必须是一个简单的字段,仅包含静态数据。因此,距离计算必须在获取之前完成,使谓词有效。