8

私のコアデータモデルには、オプションのNSNumber属性を持つエンティティがあります。

その属性の値が有効かどうかをテストするにはどうすればよいですか?

nilをテストすると、機能しません。

[self numberAttribute] == nil // always returns NO

ゼロ値のintをテストすると、それは機能しません。

[[self numberAttribute] intValue] == 0  // always returns no

実際のところ、[[self numberAttribute] intValue]]は、メモリアドレスへのポインタのように疑わしいものを返します。

誰かが私が間違っていることを知っていますか?

編集: OK、バグはコードのまったく無関係な部分にありました。NSNumberとCoreDataは、期待どおりに機能しています。そうは言っても、属性をオプションではなく、デフォルト値として0を指定するという提案されたアプローチを採用します。

この質問を見ている人のために、このメモを少しの間ここに置いてから、削除します。

4

3 に答える 3

5

ドキュメントによると、

属性がオプションであることを指定できます。つまり、値を持つ必要はありません。ただし、一般に、特に数値の場合はそうしないことをお勧めします (通常、モデル内のデフォルト値が 0 の必須属性を使用すると、より良い結果が得られます)。この理由は、SQL には、Objective-C の nil とは異なり、NULL に対する特別な比較動作があるためです。データベースの NULL は 0 と同じではなく、0 の検索は NULL を含む列と一致しません。

false == (NULL == 0)
false == (NULL != 0)

さらに、データベースの NULL は、空の文字列または空のデータ BLOB と同等ではありません。

false == (NULL == @"")
false == (NULL != @"")

したがって、nil ではない NULL でテストしてみてください。さらに良いのは、デフォルトを設定し、属性をオプションではないものに変更することです。それが私が自分のモデルで行ったことであり、実際には非常にうまく機能します。

編集:上記の私のコメントを参照してください。オプションの属性が設定されていない新しい管理対象オブジェクトを作成しようとしましたが、nil でした。

BOOL isNil = ([newManagedObject numberAttribute] == nil);  //equals YES

別の編集: 後でこれに戻って、デバッガーのキャッシュから読み込まれたオブジェクトをチェックアウトしました (gdb はあなたの友達です!)。NULL であるメモリ位置 0x0 にアクセスしようとしていました。

于 2009-07-27T15:41:44.800 に答える
0

NSNumberポインターのように見える場合は、インスタンスへのポインターである可能性があります。コア データ モデルとクラスの間に不一致がないことを確認してください (たとえばNSInteger、どこNSNumber*が期待されているか)。

クラスにスカラーがある場合は、setNilValueForKey:.

于 2009-07-27T15:56:03.210 に答える
0

ポインターのように見える大きな値が返された場合、おそらく NaN (数値ではない) ではないでしょうか?

その場合は、次の方法で確認できます。

 isnan([[self numberAttribute] doubleValue])

または、NSNotFound に沿った他の定数である可能性があります (ただし、より多くの Core Data 固有の可能性があります)。

于 2009-07-27T15:28:14.903 に答える