CoreData ожидает строку при возврате массива и NSData при возврате строки - PullRequest
2 голосов
/ 29 февраля 2012

У меня есть простой NSValueTransformer, который должен преобразовать разделенную запятыми строку first, second, third в массив.Итак, в моей схеме CoreData у меня есть атрибут options, который я установил на Transformed и указываю мой Трансформатор.

Это мой Трансформатор:

-(id)transformedValue:(id)value{
    // convert it to an array
    if(!value){
        return nil;
    } else{
        NSString *languages = value;
        NSArray *result = [languages componentsSeparatedByString: @", "];
        // return result;
        return @"test Result";
    }
}

Теперь, когда я возвращаю переменнуюresult Я получаю следующую ошибку (length выглядит так, как будто ожидал NSString):

... 'NSInvalidArgumentException', reason: '-[__NSArrayI length]: unrecognized selector sent to instance 0x6cc59a0'

Если я возвращаю тестовую строку выше, я получаю эту ошибку (bytes выглядит так, как будтоожидание объекта NSData):

... 'NSInvalidArgumentException', reason: '-[__NSCFConstantString bytes]: unrecognized selector sent to instance 0xf0780'

Похоже, есть концептуальная проблема, которую я, похоже, не понимаю.Также любопытно, что +(Class)transformedValueClass и +(BOOL)allowsReverseTransformation никогда не "касаются" при использовании отладчика.

Ответы [ 2 ]

2 голосов
/ 01 марта 2012

В предоставленном вами коде нет ошибок. Проблема заключается в подходе CoreData.

Когда вы используете преобразованное свойство в CoreData, значение сохраняется в базе данных как NSData объект. И длина в ваших ошибках связана с NSData length метод.

Следовательно, вы должны предоставить NSValueTransformer преобразование из NSData в NSArray и выполнить обратное преобразование, чтобы объединить массивы в CoreData как NSData.

Если вы хотите сохранить возможность сохранения свойства как NSString, вы можете реализовать специальный метод доступа к свойству NSString вашего управляемого объекта, который преобразует значение NSString в значение NSArray, или использовать NSValueTransformer вне вашей модели CoreData, например:

NSValueTransformer *transformer = [NSValueTransformer valueTransformerForName:@"StringToArrayValueTransformer"];
NSArray *array = [transformer transformedValue:yourEntityItem.yourStringProperty];
0 голосов
/ 29 февраля 2012

Значение должно быть приведено к NSString, попробуйте это

-(id)transformedValue:(id)value{
    // convert it to an array
    if(!value){
        return nil;
    } else{
        NSString *languages = (NSString*)value;
        NSArray *result = [languages componentsSeparatedByString: @", "];
        return result;

    }
}
...