2012-10-09 58 views
0

我有一個帶有布爾屬性的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。

+1

聽起來像一個保留名稱的碰撞,一些深層撒謊(?)使用關鍵字「已刪除」。 (在'NSManagedObject'的上下文中,或者在'NSFetchedResultsController'中可能並不奇怪。)嘗試將該字段的名稱更改爲其他名稱。 – ilmiacs

+0

優秀的本能 - 這確實解決了它。當然'NSManagedObject'對'isDeleted'做出了迴應,所以我想我應該對此更偏執。謝謝,並且通過一切手段將其寫成答案,以便我可以將其標記爲正確。 – Thom

+0

我無法在任何地方找到保留的屬性名稱列表,除了明顯的'description'和一些表明'version'也被禁止的指示。如果有人知道這樣的資源,我很樂意將它從這裏鏈接起來。 – Thom

回答

5

聽起來像一個保留名稱的碰撞,一些深層的無證(?)使用關鍵字刪除。 (在NSManagedObjectNSFetchedResultsController的範圍內,這並不奇怪。)嘗試將該字段的名稱更改爲其他名稱。

+0

真是太棒了! +1謝謝! – VisioN