我有一个带有布尔属性的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.
答案 0 :(得分:5)
听起来像是与保留名称冲突,一些深层未记录(?)使用关键字已删除。 (在NSManagedObject
或NSFetchedResultsController
中可能并不奇怪。)尝试将字段名称更改为其他内容。