Выражение значения при переносе основных данных, приводящее к необычным результатам
У меня есть приложение для 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);
Решение, описанное по этой ссылке, сработало очень хорошо для меня.
Вкратце, в нем говорится, что вы можете написать функцию в любом классе (метод Class, а не экземпляр) в вашем проекте (скажем, в классе утилит) и вызвать этот метод с помощью выражения FUNCTION (подробности о синтаксисе см. В ссылке). Это позволяет вам писать довольно сложный код для изменения определенного атрибута объекта без написания всей политики миграции объекта для всего объекта.