コアデータデータベースにint32
という属性があります。 enum
ビットフィールドにはint
を使用します。コアデータでバイナリフラグを使用するには?
このintのバイナリ の値に基づいてアイテムを照会するにはNSPredicate
を作成できますか?何か@"bitFieldAttribute & 0x0001"
のようなもの?
これはバイナリ型の属性で可能かどうかも疑問に思っていますか?
コアデータデータベースにint32
という属性があります。 enum
ビットフィールドにはint
を使用します。コアデータでバイナリフラグを使用するには?
このintのバイナリ の値に基づいてアイテムを照会するにはNSPredicate
を作成できますか?何か@"bitFieldAttribute & 0x0001"
のようなもの?
これはバイナリ型の属性で可能かどうかも疑問に思っていますか?
NSPredicate
が処理できますが、CoreDataがデータストアで実行するための有効な述語として受け入れるかどうかはわかりません。 bitwise演算子をSQLクエリに変換する際に問題が発生する可能性があります(SQLiteバッキングストアを使用している場合)。あなたはそれを試してみる必要があります。
構文は、しかし、あなたが期待するものばかりです。
NSPredicate * p = [NSPredicate predicateWithFormat:@"(3 & 1) > 0"];
NSLog(@"%@", p);
NSLog(@"%d", [p evaluateWithObject:nil]);
ログ:バイナリ型指定された属性にこれを行うためとして
3 & 1 > 0
1
(すなわち、1つはdata
のように定義します、そう?)これはおそらく動作しません。ビット演算子は、整数を操作するとき(実際に理解している限り)には意味がありますので、NSData
で実行するのは意味がありません。それを最初に番号に変換すると、それが機能するかもしれません。
編集
コアデータは、おそらく同様にそれを受け入れることを意味し、SQLiteのはbitwise operators have been around since 2001いるため、この構文をサポートしていることと思われます。
私はほとんどそれを疑いません。
ただし、属性に格納されている値にはenum
を使用し、ビットマスキングではなく直接比較を使用できます。
私はあなたが意味するものは得られません。私がしたいのは、特定のビット値に一致するエンティティをフェッチすることです(全く同じビットシーケンスに限定されません)。 – CodeFlakes
ビットマスキング技術が必要な理由の例を挙げることができますか? @CiprianL。 –
ここには:私は生物(たくさんの生物)を表す実体の束を持っています。そして、私はそれらの生物を提示すべき世界の束(16程度)を持っています。同じ生物は、複数の世界で提示することができます。だから今、私は世界のA、B、Dで提示されるべき生物を取り出す必要があります – igrek
このテクニックの1つの例/アプリケーションです。
keypath "typeValue"の整数属性を持つNSManagedObjectがあるとします。どこかあなたのコード内
は、ビットごとの列挙を定義しますタイプである管理対象オブジェクトを照会する
今typedef enum SomeType {
SomeTypeValueOne = 0x1,
SomeTypeValueTwo = 0x2,
SomeTypeValueThree = 0x4
} SomeType;
は、1個又は3個ではなく2つは、次の操作を行うと言う:
SomeType valueOneOrThree = SomeTypeValueOne | SomeTypeValueThree;
NSPredicate *someTypePredicate = [NSPredicate predicateWithFormat:@"(typeValue & %i) == typeValue", valueOneOrThree];
// construct NSFetchRequest as normal with predicate...
rockfakieとても近いですが、
NSPredicate *someTypePredicate = [NSPredicate predicateWithFormat:@"(typeValue & %i) == %i", valueOneOrThree,valueOneOrThree];
私は必要なものです。
それは動作します!!!!どうもありがとう !私はCodeDataがSQLに変換することも非常に疑わしいですが、私はそれをテストしただけで動作するようです。 – CodeFlakes
'(x&bits)> 0'ではなく'(x&bits)!= 0'をチェックする方がずっと安全です。最も高いビットを設定すると、数値が負になる可能性があるからです。番号が完全に署名されていないことが完全にわかっている場合のみ例外です。 – HughHughTeotl