а также

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

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

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

Ответы на вопрос(4)

но

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

Это то, что мне было нужно.

 chadbag11 дек. 2014 г., 20:59
было исправлено. Была глупая опечатка имени свойства из-за пердения мозга (имел дело со стороной mysql, которую приложение использует для заполнения своих объектов, и использовал имя столбца mysql вместо имени свойства CD). Благодарю.
 Jingshao Chen10 окт. 2015 г., 22:55
Это должно быть правильным ответом для правильного использования синтаксиса%i
 chadbag08 дек. 2014 г., 21:19
Хммм, я получаю CoreData с ошибкой "NSInvalidArgumentException", причина: "Неподдерживаемое выражение функции запрещено & 8" с выражением(banned & 8) == 0
 Jim Holland11 дек. 2014 г., 15:35
Можете ли вы опубликовать свое полное определение NSP предиката, пожалуйста?
Решение Вопроса

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

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

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

Журналы:

3 & 1 > 0
1

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

редактировать

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

 CodeFlakes17 янв. 2011 г., 21:23
Это работает !!!! Большое спасибо ! Я тоже был очень сомнителен, что CodeData будет переводить на SQL, но я только что проверил его, и, кажется, работает.
 HughHughTeotl11 февр. 2016 г., 11:53
Почти всегда безопаснее проверять(x & bits) != 0 скорее, чем(x & bits) > 0, Причина в том, что установка старшего бита может сделать число отрицательным. Единственное исключение - когда вы полностью уверены, что число не подписано.

Скажем, у вас есть 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...

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

 Ciprian L.17 янв. 2011 г., 20:13
Можете ли вы привести пример, почему вам нужна техника битовой маскировки?
 CodeFlakes17 янв. 2011 г., 20:09
Я не понимаю, что вы имеете в виду. Что я хочу сделать, это выбрать объекты, которые соответствуют определенным битовым значениям (не ограничиваясь той же самой битовой последовательностью).
 igrek07 сент. 2017 г., 11:49
@CiprianL. вот оно: у меня есть куча сущностей, представляющих существ (множество существ), и у меня есть куча миров (около 16 или около того), где я должен представить эти существа. Одни и те же существа могут быть представлены в нескольких мирах. Так что теперь мне нужно выбрать существ, которые должны быть представлены в мирахA, B а такжеD

Ваш ответ на вопрос