Как использовать бинарные флаги в Core Data? - PullRequest
21 голосов
/ 17 января 2011

У меня есть атрибут int32 в базе данных Core Data.Я использую это int в качестве enum битового поля.

Можно ли создать NSPredicate для запроса элементов на основе двоичного значения этого int?Что-то вроде @"bitFieldAttribute & 0x0001"?

Мне также интересно, возможно ли это с двоичным типом атрибута?

Ответы [ 4 ]

26 голосов
/ 17 января 2011

NSPredicate может с этим справиться, но я не уверен, что CoreData примет это как допустимый предикат для выполнения в хранилище данных.Возможно, возникнут проблемы с преобразованием побитового оператора в запрос SQL (если вы используете резервное хранилище SQLite).Вам просто нужно попробовать.

Синтаксис, однако, является именно тем, что вы ожидаете:

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

Журналы:

3 & 1 > 0
1

Что касаетсяделать это для атрибута бинарного типа (т. е. атрибута, определенного как data, верно?) Это, вероятно, не сработает.Битовые операторы действительно имеют смысл только при работе с целыми числами (насколько я их понимаю), поэтому выполнение их на NSData не имеет большого смысла.Сначала преобразуйте его в число, а затем оно может работать.

edit

Может показаться, что SQLite поддерживает этот синтаксис, поскольку побитовые операторы с 2001 года , что означает, что Core Data, вероятно, также примет это.

9 голосов
/ 05 февраля 2013

Rockfakie почти прав, но

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

Это то, что мне нужно.

8 голосов
/ 26 августа 2011

Вот один пример / применение этой техники.

Скажем, у вас есть NSManagedObject, у которого есть целочисленный атрибут с путем ключа "typeValue".

Где-то в вашем коде определите побитовое перечисление:

typedef enum SomeType {
    SomeTypeValueOne = 0x1,
    SomeTypeValueTwo = 0x2,
    SomeTypeValueThree = 0x4
} SomeType;

Теперь, чтобы запросить управляемые объекты типа одного или трех, но не двух, выполните следующие действия:

SomeType valueOneOrThree = SomeTypeValueOne | SomeTypeValueThree;

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

// construct NSFetchRequest as normal with predicate...
0 голосов
/ 17 января 2011

Я вряд ли в этом сомневаюсь.

Но вы можете использовать enum для значений, хранящихся в атрибуте, и использовать прямое сравнение вместо маскировки битов.

...