核心数据谓词不匹配布尔属性

时间:2012-10-09 14:35:51

标签: ios core-data nspredicate nsfetchedresultscontroller

我有一个带有布尔属性的NSManagedObject子类。它是非可选的,默认为NO。在模型界面中,它在实现中被声明为@property (nonatomic, retain) NSNumber * deleted;@dynamic deleted;

如果检查基础SQLite文件,它会正确持久化。但是,我发现带有查询此属性的谓词的提取无法正常工作。我尝试了deleted == YESdeleted == %@@YES[NSNumber numberWithBool:YES],以及deleted == 1。我甚至试过用纯粹的伏都教偏执狂的单一等号。什么都行不通。

这导致我的代码中使用NSFetchedResultsController的错误。完整谓词目前为(list = %@) OR (deleted = YES)。我将deleted更改为@YES,更改list的值,并且控制器发出意外的NSFetchedResultsChangeDelete,尽管该对象仍然在逻辑上与谓词匹配。

毫无疑问不会匹配谓词(至少在内存中),正如我测试过的那样:

BOOL matchesBefore = [self.fetchedResultsController.fetchRequest.predicate evaluateWithObject:thing];
// do stuff, setting thing.deleted = @YES, thing.list = @"something else"
BOOL matchesAfter = [self.fetchedResultsController.fetchRequest.predicate evaluateWithObject:thing];
NSAssert(matchesBefore && matchesAfter, @"Should still match");

有趣的是,在调试器中,该属性显示为deleted = 0;,但是打印实际的NSNumber会产生(NSNumber *) $5 = 0x07455ec0 1。同样,在底层数据库中,值正确存储为“1”。

所以我很困惑。有任何想法吗?这是iOS,在模拟器和设备上都是5.x.

1 个答案:

答案 0 :(得分:5)

听起来像是与保留名称冲突,一些深层未记录(?)使用关键字已删除。 (在NSManagedObjectNSFetchedResultsController中可能并不奇怪。)尝试将字段名称更改为其他内容。