IPhone: сохранение булевых данных в базовые данные
Я установил один из моих основных атрибутов данных как логический. Теперь мне нужно установить его, но XCode продолжает говорить мне, что он может не отвечать на setUseGPS.
[ride setUseGPS: useGPS.on];
Каков метод установки булевых данных ядра? Все мои другие атрибуты настроены таким образом, и они отлично работают. Итак, не знаете, почему логическое значение не работает таким образом?
Ответы
Ответ 1
Основные данные "не имеют" логического типа (он есть, но это NSNumber).
Итак, чтобы установить эквивалент useGPS = YES.
[entity setUseGPS:[NSNumber numberWithBool:YES]];
И наоборот:
BOOL isGPSOn = [[entity useGPS] boolValue];
Update:
Как указано SKG, с литералами в Objetive-C вы можете сделать это проще:
[entity setUseGPS:@YES];
BOOL isGPSOn = entity.useGPS.boolValue;
Ответ 2
Как альтернативный подход к принятому ответу, вы можете просто изменить ввод из NSNumber * в BOOL в определении интерфейса управляемого объекта, например:
@property (nonatomic) BOOL useGPS; // Notice that the 'retain' is also removed as we're now dealing with a scalar rather than an NSObject
Обсуждаются различные альтернативные подходы здесь, но Ответ Криса Хансона освещая для меня, особенно:
Если у вас есть числовой атрибут (включая логический атрибут), который требуется, вы можете просто набрать его как вместо этого скаляр, и Core Data правильная вещь:
@property (неатомный) BOOL isDone;
Даже если атрибут является необязательным, это все равно будет работать - это будет просто conflate "not present" с "false."
и для более выровненной реализации Cocoa:
Еще одна вещь, которую вы, возможно, захотите сделать это свойство "сделано" и просто укажите геттер как "isDone". Это обычное соглашение о присвоении имен Cocoa:
@property (неатомный, getter = isDone) BOOL done;
Тогда вы можете написать "if (item.done) {...}" или "item.done = NO;" и компилятор все равно будет генерировать -isDone для доступа к собственности.
Спасибо Крису и надеюсь, что это поможет кому-то.
Ответ 3
"Исправить" для этого (IMHO, это ошибка в Apple SDK), заключается в том, чтобы добавить следующий код в ваш генерируемый CoreData класс. NB: если вы делаете это в какой-либо категории в отдельном файле, вам не нужно повторно копировать/вставлять его каждый раз, когда вы восстанавливаете классы CoreData внутри Xcode
- (BOOL)useGPS
{
[self willAccessValueForKey:@"useGPS"];
BOOL myuseGPS = [[self primitiveUseGPS] boolValue];
[self didAccessValueForKey:@"useGPS"];
return myuseGPS;
}
- (void)setUseGPS:(BOOL)newValue
{
[self willChangeValueForKey:@"useGPS"];
[self setPrimitiveUseGPS:[NSNumber numberWithBool:newValue]];
[self didChangeValueForKey:@"useGPS"];
}