【发布时间】:2011-03-06 00:46:08
【问题描述】:
我正在尝试创建一个 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.xml 中有代码的问题。它似乎完全忽略了 AND 语句的第一部分。
我看不出两者之间有什么区别会导致不同的结果。有人可以帮忙吗?
EDIT 更简单的解释:
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"]);
filteredQuestionChoices1 包含一个代码为“A”的项目。 filtersQuestionChoices2 没有该项目。第二个谓词如何过滤掉第一个谓词没有过滤掉的任何东西?两个语句都使用完全相同的谓词。如果我在数组上使用谓词,如果完全相同的谓词将过滤掉这些对象,为什么我要从 fetchedRequest 中取回对象?
【问题讨论】:
标签: objective-c ios nspredicate nsfetchrequest