2010-05-30 2 views
52

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

[ride setUseGPS: useGPS.on]; 

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

+0

Заканчивать NSNumber –

ответ

131

Основные данные «не имеют» булева типа (это так, но это NSNumber).

Чтобы установить эквивалент использованияGPS = ДА.

[entity setUseGPS:[NSNumber numberWithBool:YES]]; 

И наоборот:

BOOL isGPSOn = [[entity useGPS] boolValue]; 

Update: Как отметил SKG, С литералов в Цель СССР-C теперь вы можете сделать это более простым способом:

[entity setUseGPS:@YES]; 

BOOL isGPSOn = entity.useGPS.boolValue; 
+9

Вы можете установить значение... например: object.isGPSOn = @YES; ' – guptron

+0

По-видимому, я могу увидеть тип Boolean в раскрывающемся списке при создании нового атрибута в редакторе основных данных. Что это? –

0

«Исправлено» для этого (IMHO, это ошибка в SDK от Apple) заключается в том, чтобы добавить следующий код в класс, генерируемый 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"]; 
} 
+0

Это приводит к конфликтующим типам при компиляции. Должен ли я изменять типы существующих свойств NSNumber? –

+0

@ Daniel Wood - не меняйте существующие типы: CoreData требует, чтобы они были NSNumber. компиляционные предупреждения раздражают - легкое обходное решение - переименовать вышеприведенные два метода в «useGPSAsBool» и «setUseGPSAsBool». NB: вы все равно можете получить доступ к свойству, только теперь он называется «GPSAsBool», например. «if (myCoreDataObject.GPSAsBool)» – Adam

+0

Прочитав следующее в документах, я решил не беспокоиться об этом и просто конвертировать из NSNumber в свой код: «Преимущества предоставления Core Data для управления собственным хранилищем обычно превосходят любые преимущества взаимодействия непосредственно со скалярными значениями "http://developer.apple.com/library/iOS/#documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html –

18

В качестве альтернативного подхода к общепринятый ответ, вы можете просто изменить ввод от 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 

Различные альтернативные подходы обсуждаются here, но Chris Hanson «s ответ был наиболее освещающей для меня , особенно:

Если у вас есть числовой атрибут (включая булевой атрибут), что требуется , вы можете просто ввести его в качестве скаляра вместо этого, и ядра данные будут делать правильную вещь:

@property (неатомическую) BOOL isDone;

Даже если атрибут не является обязательным, , который все равно будет работать - это будет только conflate "not present" с "false".

и для более выровненной реализации какао:

Еще одна вещь, которую вы можете сделать это назвать свойство «сделано» и просто указать добытчика как «IsDone.» Это обычное соглашение об именовании какао:

@property (nonatomic, getter = isDone) BOOL done;

Тогда вы можете написать "if (item.done) { ...}" или "item.сделано = NO;»и компилятора будет по-прежнему генерировать -isDone для доступов собственности

Спасибо Крис, и надеюсь, что это поможет кому-то

+1

Я вижу крах на iOS 4.x, когда я пробую этот метод. Вот сообщение: «Свойство« bar »является скалярным типом в классе« Foo ». Невозможно создать для него метод getter». Я попытался установить тип атрибута в Boolean в модели Core Data, и я также попробовал Integer 16. Я получаю тот же самый сбой в любом случае. Я что-то упускаю? Возможно, я просто вернусь к использованию NSNumber. –

+2

Насколько я знаю, это не работает в подклассах NSManagedObject. – teh1