Как хранить пользовательские объекты со структурой в Coredata - PullRequest
6 голосов
/ 16 августа 2010

Я должен сохранить объект пользовательского класса в Coredata. Проблема в том, что мой пользовательский класс содержит структуры, перечисления и т. Д. Я попробовал следующий метод.

- (void) encodeWithCoder: (NSCoder *) кодировщик.

Но я получаю эту ошибку

[NSKeyedArchiver encodeValueOfObjCType: at:]: этот архиватор не может кодировать структуры '

Как лучше хранить этот объект в Coredata. Пожалуйста, помогите мне.

Ответы [ 3 ]

6 голосов
/ 16 августа 2010

Вы можете обернуть структуру в NSData, т.е.

Для кодирования с помощью архиватора

[coder encodeObject:[NSData dataWithBytes:&my_struct length:sizeof(my_struct)] 
             forKey:@"my_struct"];

и расшифровать с помощью архиватора

NSData *data = [coder decodeObjectForKey:@"my_struct"];
[data getBytes:&my_struct length:sizeof(my_struct)];
4 голосов
/ 16 августа 2010

В вашем пользовательском классе должна быть пользовательская реализация протокола NSCoding. В ваших собственных реализациях -[initWithCoder:] и -[encodeWithCoder:] вы можете затем кодировать / декодировать объекты структуры любым удобным вам способом.

На этом пути можно вызвать [coder encodeObject:[NSValue valueWithBytes:&yourStructVariable objCType:@encode(struct YourStructName)] forKey:@"someKey"]; в -[encodeWithCoder:] и выполнить эквивалентное декодирование в -[initWithCoder:].

Затем вы можете просто сохранить объекты класса как трансформируемые в Базовых данных.

1 голос
/ 16 августа 2010

Думаю, со структурой лучше всего создать функцию, которая может кодировать и декодировать структуру, как любой объект Objective-C.

С перечислениями я не уверен. Перечисления - это просто числа, связанные с именем, поэтому просто кодируйте и декодируйте их как числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...