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

IPhone: сохранение булевых данных в базовые данные

Я установил один из моих основных атрибутов данных как логический. Теперь мне нужно установить его, но XCode продолжает говорить мне, что он может не отвечать на setUseGPS.

[ride setUseGPS: useGPS.on];

Каков метод установки булевых данных ядра? Все мои другие атрибуты настроены таким образом, и они отлично работают. Итак, не знаете, почему логическое значение не работает таким образом?

4b9b3361

Ответ 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"];
}