2011-01-17 5 views
20

コアデータデータベースにint32という属性があります。 enumビットフィールドにはintを使用します。コアデータでバイナリフラグを使用するには?

このintのバイナリ の値に基づいてアイテムを照会するにはNSPredicateを作成できますか?何か@"bitFieldAttribute & 0x0001"のようなもの?

これはバイナリ型の属性で可能かどうかも疑問に思っていますか?

答えて

25

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いるため、この構文をサポートしていることと思われます。

+0

それは動作します!!!!どうもありがとう !私はCodeDataがSQLに変換することも非常に疑わしいですが、私はそれをテストしただけで動作するようです。 – CodeFlakes

+0

'(x&bits)> 0'ではなく'(x&bits)!= 0'をチェックする方がずっと安全です。最も高いビットを設定すると、数値が負になる可能性があるからです。番号が完全に署名されていないことが完全にわかっている場合のみ例外です。 – HughHughTeotl

-1

私はほとんどそれを疑いません。

ただし、属性に格納されている値にはenumを使用し、ビットマスキングではなく直接比較を使用できます。

+0

私はあなたが意味するものは得られません。私がしたいのは、特定のビット値に一致するエンティティをフェッチすることです(全く同じビットシーケンスに限定されません)。 – CodeFlakes

+0

ビットマスキング技術が必要な理由の例を挙げることができますか? @CiprianL。 –

+0

ここには:私は生物(たくさんの生物)を表す実体の束を持っています。そして、私はそれらの生物を提示すべき世界の束(16程度)を持っています。同じ生物は、複数の世界で提示することができます。だから今、私は世界のA、B、Dで提示されるべき生物を取り出す必要があります – igrek

8

このテクニックの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... 
7

rockfakieとても近いですが、

NSPredicate *someTypePredicate = [NSPredicate predicateWithFormat:@"(typeValue & %i) == %i", valueOneOrThree,valueOneOrThree]; 

私は必要なものです。

+0

Hnmm、エラー "'NSInvalidArgumentException'でCoreData barfingが発生しました。理由: 'サポートされていない関数式の使用が禁止されています。'と式'(禁止された&8)== 0 'が付きました – chadbag

+0

NSPredicate定義全体を投稿できますか? –

+0

が修正されました。脳の怒りのためにプロパティ名の愚かなタイプミス(アプリケーションがそのオブジェクトを設定するために使用し、CDプロパティ名の代わりにmysql列名を使用するmysql側を処理していた)。ありがとう。 – chadbag

関連する問題