Хранение NSManagedObject в словаре (NSDictionary) - PullRequest
18 голосов
/ 14 апреля 2011

У меня есть пользовательский класс, который является подклассом 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

Ответы [ 3 ]

51 голосов
/ 14 апреля 2011

Вы уверены, что ошибка возникает, когда вы создаете словарь, как это подразумевается кодом, который вы опубликовали?

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];
0 голосов
/ 18 марта 2017

Быстрая версия на случай, если кому-то понадобится

import CoreData 
extension NSManagedObject {
    func toDict() -> [String:Any] {
        let keys = Array(entity.attributesByName.keys)
        return dictionaryWithValues(forKeys:keys)
    }
}
0 голосов
/ 14 апреля 2011

В моем приложении я также храню МО в словаре (но не держу, я храню в массиве), но без приведения. пожалуйста, попробуйте, если это произойдет и для массива.

И вы можете сначала попытаться создать словарь, а затем назначить объекты.

NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setValue:managedObject forKey:@"thisOne"];
...