Хранение NSManagedObject в словаре (NSDictionary)
У меня есть пользовательский класс, который является подклассом NSManagedObject
. Я хотел бы сохранить его в словаре, но при попытке сделать это я получаю ошибку Property list invalid for format: 200
.
Вот как я пытаюсь создать словарь:
NSDictionary *dictionary =
[NSDictionary dictionaryWithObject: voiceMemo forKey:@"voiceMemo"];
Тот же результат при попытке
NSDictionary *dictionary =
[NSDictionary dictionaryWithObject: (NSData *) voiceMemo forKey:@"voiceMemo"];
Он работает, однако, при попытке сохранить отдельные атрибуты отдельно:
NSDictionary *dictionary =
[NSDictionary dictionaryWithObject: voiceMemo.attribute forKey:@"attribute"];
NSDictionary
должен иметь возможность хранить объекты данных, поэтому я предполагаю, что реальный вопрос заключается в том, как передать объект NSManagedObject
в NSData
Ответы
Ответ 1
Вы уверены, что ошибка возникает при создании словаря, как это подразумевается в коде, который вы опубликовали?
Property list invalid for format: 200
звучит так, будто вы пытаетесь записать свой NSManagedObject
в файловую систему. Что не будет работать, потому что NSManagedObjects
не подтверждают NSCoding
.
Вы можете сохранить атрибуты NSManagedObject в NSDictionary и сохранить этот словарь в файле.
NSArray *keys = [[[myObject entity] attributesByName] allKeys];
NSDictionary *dict = [myObject dictionaryWithValuesForKeys:keys];
и когда вы хотите его восстановить, вы устанавливаете значения вашего управляемого объекта как это:
[myObject setValuesForKeysWithDictionary:dict];
Ответ 2
В моем приложении я также храню МО в словаре (но не держись, я храню в массиве), но без какого-либо перевода. попробуйте, если это произойдет и для массива.
И вы можете сначала попытаться создать словарь, а затем назначить объекты.
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setValue:managedObject forKey:@"thisOne"];
Ответ 3
Быстрая версия на случай, если кому-то это понадобится
import CoreData
extension NSManagedObject {
func toDict() -> [String:Any] {
let keys = Array(entity.attributesByName.keys)
return dictionaryWithValues(forKeys:keys)
}
}