我有一個帶有布爾屬性的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。
聽起來像一個保留名稱的碰撞,一些深層撒謊(?)使用關鍵字「已刪除」。 (在'NSManagedObject'的上下文中,或者在'NSFetchedResultsController'中可能並不奇怪。)嘗試將該字段的名稱更改爲其他名稱。 – ilmiacs
優秀的本能 - 這確實解決了它。當然'NSManagedObject'對'isDeleted'做出了迴應,所以我想我應該對此更偏執。謝謝,並且通過一切手段將其寫成答案,以便我可以將其標記爲正確。 – Thom
我無法在任何地方找到保留的屬性名稱列表,除了明顯的'description'和一些表明'version'也被禁止的指示。如果有人知道這樣的資源,我很樂意將它從這裏鏈接起來。 – Thom