23

int32CoreDataデータベースに属性があります。これintenumビットフィールドとして使用します。

NSPredicateこのintのバイナリ値に基づいてアイテムをクエリするためのを作成することは可能ですか?のようなもの@"bitFieldAttribute & 0x0001"

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

4

4 に答える 4

30

NSPredicateはそれを処理できますが、CoreDataがデータストアで実行するための有効な述語としてそれを受け入れるかどうかはわかりません。ビット演算子をSQLクエリに変換する際に問題が発生する可能性があります(SQLiteバッキングストアを使用している場合)。あなたはそれを試してみる必要があります。

ただし、構文は期待どおりです。

NSPredicate * p = [NSPredicate predicateWithFormat:@"(3 & 1) > 0"];
NSLog(@"%@", p);
NSLog(@"%d", [p evaluateWithObject:nil]);

ログ:

3 & 1 > 0
1

バイナリタイプの属性(つまり、として定義されている属性data)でこれを行う場合、これはおそらく機能しません。ビット単位の演算子は、整数を操作する場合にのみ実際に意味があります(私が理解しているように)ので、それを実行することはNSDataあまり意味がありません。最初に数値に変換してから、機能する可能性があります。

編集

ビット単位の演算子は2001年から存在しているため、SQLiteはこの構文をサポートしているように見えます。これは、 CoreDataもおそらくそれを受け入れることを意味します。

于 2011-01-17T19:52:41.583 に答える
10

rockfakieはほぼ正しいですが

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

私が必要としていたものです。

于 2013-02-05T19:54:06.990 に答える
8

これがこのテクニックの1つの例/アプリケーションです。

キーパス「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...
于 2011-08-26T15:36:52.127 に答える
-1

私はそれを疑うことはほとんどありません。

ただしenum、属性に格納されている値にを使用し、ビットマスキングの代わりに直接比較を使用することもできます。

于 2011-01-17T19:00:28.350 に答える