Выражение значения при переносе основных данных, приводящее к необычным результатам

У меня есть приложение для iOS, модель Core Data которого я пытаюсь перевести на новую версию.

В v2 модели Core Data есть одно новое поле (photoFilename), и его значение можно сгенерировать для существующих записей, используя поле v1 (dateInSeconds) и добавляя ".jpg".

Например

version 1                               | version 2
field          data                     | field          data
========================================|==============================
dateInSeconds (Integer 32)  401760341   | dateInSeconds (Integer 32)  401760341
                                        | photoFilename (String)  401760341.jpg 

Я создал базовую модель отображения данных (частично показанную ниже), и, похоже, база данных мигрирует. К сожалению, созданное фотофайл не дает правильного номера перед ".jpg". Например, он может вернуть "275263312.jpg" вместо "401760341.jpg"

По общему признанию, я никогда не использовал такое отображение прежде, и документация Apple здесь кажется очень ограниченной.

В других исследованиях выясняется, что "выражение значения" является типом выражения NSE и может быть воспроизведено для целей тестирования.

NSExpression *expr = [NSExpression expressionWithFormat:@"FUNCTION('', 'stringByAppendingFormat:', '%d.jpg', 401760341)"];
id result = [expr expressionValueWithObject:nil context:nil];
NSLog(@"result: %@", result);

Тем не менее, это оценивается аналогично с неправильным числом перед ".jpg".

Может ли кто-нибудь указать, почему полученный оценочный результат не является моим ожидаемым результатом?

2 ответа

Я все еще не уверен в точной причине моей проблемы, но наткнулся на следующую работу в моей модели отображения, приведя ее в качестве NSString

или для тех из вас, кто следует по NSExpression

NSExpression *expr = [NSExpression expressionWithFormat:@"FUNCTION('', 'stringByAppendingFormat:', '%@.jpg', CAST(401760341, 'NSString') )"];
id result = [expr expressionValueWithObject:nil context:nil];
NSLog(@"result: %@", result);

Решение, описанное по этой ссылке, сработало очень хорошо для меня.

http://www.cocoabuilder.com/archive/cocoa/197476-custom-entity-migration-policies-atribute-from-nsstring-to-nsdate.html

Вкратце, в нем говорится, что вы можете написать функцию в любом классе (метод Class, а не экземпляр) в вашем проекте (скажем, в классе утилит) и вызвать этот метод с помощью выражения FUNCTION (подробности о синтаксисе см. В ссылке). Это позволяет вам писать довольно сложный код для изменения определенного атрибута объекта без написания всей политики миграции объекта для всего объекта.

Другие вопросы по тегам