2015-07-06 2 views
0

У меня есть объект, называемый Core DataСтатуса с двумя атрибутами savedMessageID в Integer32 и savedMessageText как String.Сложность написания числового значения обратно в Core Data

У меня есть строка, хранящаяся в базе данных SQL, которую приложение загружает при запуске. Строка из базы данных разбивается на две части ID и текст:

NSInteger *newMessageID = [the_ID_as_a_string integerValue]; 
    NSString *newMessageText = the_message_as_a_string; 

Затем я прочитал Ядро данных записи и сравнения идентификаторов, чтобы увидеть, если произошло изменение. Если загруженный идентификатор больше, чем сохраненный идентификатор, отображается новое сообщение. Пока это работает.

Затем я попытаюсь написать обратно Основные данные с новым загруженным ID. Вот проблема ... много говорили здесь уже я знаю:

NSEntityDescription *entitydesc = [NSEntityDescription entityForName:@"Status" inManagedObjectContext:context]; 
NSManagedObject *updatedStatus = [[NSManagedObject alloc]initWithEntity:entitydesc insertIntoManagedObjectContext:context]; 
[updatedStatus setValue:newMessageID forKey:@"savedMessageID"]; //**error line** 
[updatedStatus setValue:newMessageText forKey:@"savedMessageText"]; 
NSError *error; 
[context save:&error]; 

Кажется, я не могу писать обратно в NSInteger обратно в Core Data. Я пробовал писать NSNumber, int и т. Д., Но все эти проблемы с флагом. Любые идеи, как я должен это делать?

** Ошибка я получаю * неявное преобразование без Objective-C указатель на NSInteger * '(он же' INT «) в 'ид' отвергается с ARC

+0

Какова фактическая ошибка, которую вы получаете? –

+0

NSInteger - это всего лишь тип int (работает в арсенале LP64), поэтому если вы передали это, как Core Data может интерпретировать его как нечто иное, чем адрес NSNumber? вот как это работает ... какая ошибка вы получаете, сохраняет сбой, или вы получаете значение, которого вы не ожидаете, когда читаете из другого контекста? –

+0

Ошибка: неявное преобразование указателя не-Objective-C в NSInteger * '(aka' int * ') в' id 'запрещено ARC – RGriffiths

ответ

3

Вы сделали ошибка. Свойство [the_ID_as_a_string integerValue] возвращает целочисленное значение, а не указатель на него. Правильно это:

NSInteger newMessageID = [the_ID_as_a_string integerValue]; 

и затем установить значение (ожидается в NSNumber):

[updatedStatus setValue:@(newMessageID) forKey:@"savedMessageID"]; 

или

[updatedStatus setValue:[NSNumber numberWithInteger:newMessageID] forKey:@"savedMessageID"]; 

Я предлагаю вам создавать строгие модели, чтобы избежать несоответствия типов (см ответы здесь How to create classes after creating Core Data model in Xcode for iPhone).

+0

Я боюсь, что не понимаю. Я думал, что мне нужно целое значение, а не указатель. И numberFromInteger, похоже, не существует для меня. Вы предполагаете, что Core Data ожидает, что тип NSNumber будет записан обратно? – RGriffiths

+0

Это '[NSNumber numberWithInteger:]' - моя ошибка. Похоже, вы не читаете документацию Apple. NSNumber хорошо документирован. Также, если вы наберете '[NSNumber number' - Xcode предложит вам правильные методы - посмотрите на них. CoreData ожидает числовые значения, встроенные в NSNumber, но если вы создадите классы моделей, вы можете напечатать свойства. –

+0

Получил это сейчас - спасибо. Работает. Я читаю документы Apple, но это меня сильно озадачило. Приветствия. – RGriffiths

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

  • Нет связанных вопросов^_^