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」として正しく保存されます。

だから私は非常に混乱しています。何か案は?これは、シミュレーターとデバイスの両方で 5.x の iOS です。

4

1 に答える 1

5

予約済みの名前との衝突のように聞こえます。これは、文書化されていない (?) キーワードの深い嘘の使用の削除されたものです。( a のコンテキストではNSManagedObject、またはおそらく ではおかしくありませんNSFetchedResultsController。) フィールドの名前を別の名前に変更してみてください。

于 2012-10-09T16:18:01.293 に答える