2009-07-27 2 views
6

В моей основной модели данных у меня есть объект с дополнительным атрибутом NSNumber.Хранение дополнительного NSNumber в данных ядра

Как проверить, соответствует ли значение в этом атрибуте?

Когда я тестирую ноль ... не работает.

[self numberAttribute] == nil // always returns NO 

Когда я тестирую нулевое значение int, это не работает.

[[self numberAttribute] intValue] == 0 // always returns no 

В самом деле, [[само numberAttribute] intValue]] возвращает то, что выглядит подозрительно, как указатель на адрес памяти.

Кто-нибудь знает, что я делаю неправильно?

EDIT: ОК, ошибка была в абсолютно несвязанной части кода. NSNumber и Core Data функционируют точно так, как и следовало ожидать. Тем не менее, я собираюсь пойти с предлагаемым подходом к тому, чтобы сделать атрибут не факультативным и указать 0 как значение по умолчанию.

Просто поместите здесь эту заметку на некоторое время для тех, кто смотрел этот вопрос, затем я удаляю его.

+1

У меня нет достаточного количества прав для редактирования, но ваш второй пример кода имеет несбалансированные скобки (2 открывающих скобки и 3 закрытия). – Mark

+0

Спасибо большое. Исправлена. – mmc

+0

numberAttribute указывается как float в модели данных? Как объявляется свойство numberAttribute? Каковы они имеют отношение к реализациям (если вы не используете @dynamic accessors.) Без этой информации на ваш вопрос невозможно ответить точно. –

ответ

0

Если вы получаете большое значение обратно, которое выглядит как указатель, возможно, это NaN (а не число)?

Если да, то вы можете проверить с:

isnan([[self numberAttribute] doubleValue]) 

Или, возможно, это какой-то другой постоянны вдоль линий NSNotFound (хотя, вероятно, более конкретно основных данных).

+0

Пробовал несколько разных вкусов этой техники, не работал. Значение, которое я получаю, не является константой, и оно отчитывается в отладчике (сводный столбец) как «Недопустимый». Это довольно странно, я предположил, что если бы я не установил атрибут вообще, и если бы он был помечен как «необязательный» со значением по умолчанию «0» в .xcdatamodel, этого просто не было бы так сложно достичь. – mmc

+0

Если у вас есть пометка как необязательная, значение по умолчанию не будет установлено ... Я думаю, что вы в основном получаете какой-то недействительный объект назад, который представляет неопределенное состояние. Я не могу найти в Core Data, как вы должны признать недопустимый объект, хотя ... –

+0

Я проверил с кем-то другим, у которого есть рабочий проект Core Data с необязательными атрибутами - он думал, что неустановленная ценность должна быть фактически равна нулю, точно так же, как вы проверяли. Поэтому я бы согласился с теорией о том, что вы возвращаете объект NSNumber, как постулировал porneL. –

5

Согласно documentation,

Вы можете указать, что атрибут является необязательным, то есть, оно не должно иметь значение. В целом, однако, вам не рекомендуется делать это, особенно для числовых значений (как правило, вы можете получить лучшие результаты, используя обязательный атрибут со значением по умолчанию - в модели - 0). Причиной этого является то, что SQL имеет особое поведение сравнения для NULL, что в отличие от нуля Objective-C. NULL в базе данных не совпадает с 0, и поиск 0 не будет соответствовать столбцам с NULL.

false == (NULL == 0) 
false == (NULL != 0) 

Кроме того, NULL в базе данных не эквивалентно пустой строке или пустой сгустка данных, либо:

false == (NULL == @"") 
false == (NULL != @"") 

Итак, попробуйте тест с NULL, который не ноль. Еще лучше установите значение по умолчанию и измените атрибут, который не является необязательным. Это то, что я закончил делать в своих моделях, и на практике это работает очень хорошо.

Редактировать: Смотрите мой комментарий выше. Я попытался создать новый управляемый объект с необязательным атрибутом, который не был установлен, и это было ноль.

BOOL isNil = ([newManagedObject numberAttribute] == nil); //equals YES 

Другой редактирование: я вернулся к этому позже и проверили объект загружается из кэша в отладчик (GDB является вашим другом!). Он пытался получить доступ к ячейке памяти 0x0, которая является NULL.

+0

Да, но реальный вопрос в том, есть ли у вас атрибут, объявленный как необязательный - как вы проверяете, установлено ли оно или нет? –

+0

Правда. Я сделал еще несколько проверок и добавил детали к моему ответу. – Don

+0

Я согласен, что это правильная проверка, тайна в том, что он не получает ноль, но имеет какое-то нечетное значение ... –

0

Если это так, указатель, это может быть указатель на экземпляр NSNumber. Убедитесь, что у вас нет несоответствия между базовой моделью данных и классом (например, NSInteger, где ожидается NSNumber*).

Если у вас есть скаляр в вашем классе, то вам необходимо отметить, что вы сами в setNilValueForKey:.

+1

Это кажется мне наиболее вероятным (не то, что кто-то с этой удивительной шляпой нуждается в резервном копировании в любом случае). –

Смежные вопросы