Подтвердить что ты не робот

Как использовать двоичные флаги в Core Data?

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

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

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

4b9b3361

Ответ 1

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

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

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

Logs:

3 & 1 > 0
1

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

изменить

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

Ответ 2

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

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

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

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

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

SomeType valueOneOrThree = SomeTypeValueOne | SomeTypeValueThree;

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

// construct NSFetchRequest as normal with predicate...

Ответ 3

rockfakie настолько почти прав, но

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

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

Ответ 4

Я почти не сомневаюсь.

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