ブール属性を持つ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」として正しく保存されます。
だから私は非常に混乱しています。何か案は?これは、シミュレーターとデバイスの両方で 5.x の iOS です。