带谓词的CoreData fetchRequest错误地跳过NULL值

时间:2016-05-27 02:50:29

标签: ios xcode core-data ios9.2

我的CoreData中存储的对象如下所示:

id  name  type
1   cat   aaa
2   dog   bbb
3   ape   NULL

我正在基于“type”属性获取这些对象,如下所示:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:self.entityName];

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"type != %@", @"aaa"];
fetchRequest.fetchBatchSize = 100;
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"type" ascending:YES]];

NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"section" cacheName:nil];
fetchedResultsController.delegate = self;

NSError *error = nil;
[fetchedResultsController performFetch:&error];

所以,我只是试图获取类型不像“aaa”的所有对象。

获取请求意外地省略了谓词中指定的具有“aaa”类型的对象,以及未设置类型的对象(null),从而产生以下结果:

id  name  type
2   bar   bbb

而不是我期望的那样:

id  name  type
2   dog   bbb
3   ape   NULL

使用谓词格式时会出现同样的问题:NOT (type IN {"aaa", "bbb"})。这是我需要的实际方式。该谓词导致没有获取记录。

我无法理解为什么会发生这种情况,因为如果我没有指定谓词,那么所有对象都会被正确获取。如果我将谓词更改为:

,则会正确获取具有NULL类型的对象
[NSPredicate predicateWithFormat:@"type = null"];

请注意;以上所有内容只是说明问题归结为什么。我的实际代码更复杂,并且只使用谓词格式:type != "aaa" OR type = null是我希望尽可能避免的。

任何帮助都非常感谢!