我正在尝试创建一个 fetchRequest 来显示所有不在另一个数组中的值。此代码返回我期望的数组:
NSArray *questionChoices = [self.currentQuestionChoiceGroup.questionChoices allObjects];
NSArray *filteredQuestionChoices = [questionChoices filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"NONE %@ == code", myarr]];
myarr 包含 1 项,并且该 1 项按预期从过滤结果中排除。但是,此代码不起作用:
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"QuestionChoice" inManagedObjectContext:self.managedObjectContext];
request.predicate = [NSPredicate predicateWithFormat:@"NONE %@ == code AND questionChoiceGroup == %@", myarr, self.currentQuestionChoiceGroup];
当我执行这个获取请求时,我得到了属于当前 questionChoiceGroup 的所有 questionChoices,包括在 myarr 中有代码的那个。它似乎完全忽略了 AND 语句的第一部分。
我看不出两者之间有什么区别会导致不同的结果。任何人都可以帮忙吗?
编辑更简单的解释:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"questionChoiceGroup == %@ AND NONE %@ == code", self.currentQuestionChoiceGroup, [NSArray arrayWithObject:@"A"]];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"displayOrder" ascending:YES]];
request.entity = [NSEntityDescription entityForName:@"QuestionChoice" inManagedObjectContext:self.managedObjectContext];
request.predicate = predicate;
NSArray *filteredQuestionChoices1 = [self.managedObjectContext executeFetchRequest:request error:nil];
NSLog(@"my filtered question choices 1: %@", [filteredQuestionChoices1 valueForKey:@"code"]);
NSArray *filteredQuestionChoices2 = [filteredQuestionChoices1 filteredArrayUsingPredicate:predicate];
NSLog(@"my filtered question choices 2: %@", [filteredQuestionChoices2 valueForKey:@"code"]);
filtersQuestionChoices1 包含一个代码为“A”的项目。filtersQuestionChoices2 没有该项目。第二个谓词如何过滤掉第一个谓词没有过滤掉的任何东西?两个语句都使用完全相同的谓词。如果我在数组上使用谓词,如果完全相同的谓词将过滤掉这些对象,为什么我要从 fetchedRequest 中取回对象?