我有一个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 上。