我有一个NSManagedObject带有布尔属性的子类。它是非可选的,NO作为默认值。在模型接口中,它被声明为@property (nonatomic, retain) NSNumber * deleted;,在实现中,@dynamic deleted;。
如果我检查底层 SQLite 文件,它会正确保留。但是,我发现使用查询此属性的谓词进行的提取无法正常工作。我已经尝试过deleted == YES,deleted == %@和@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 上。