Сохранение NSManagedObject в словаре (NSDictionary)

#iphone #cocoa-touch #ios #nsdictionary #nsmanagedobject

#iPhone #cocoa-touch #iOS #nsdictionary #nsmanagedobject

Вопрос:

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

и когда вы хотите его восстановить, вы устанавливаете значения вашего managedObject следующим образом:

 [myObject setValuesForKeysWithDictionary:dict];
  

Комментарии:

1. Вы правы, ошибка возникает в следующей строке, когда я пытаюсь записать данные (в данном случае в userData UILocalNotification). Как я писал в вопросе, сохранение атрибутов по отдельности действительно работает, так что это решает проблему. Я просто подумал (или надеялся), что есть способ обойти это. Спасибо!

2. Я искал в Google, чтобы получить массив ключей, NSArray *keys = [[[Объект MyObject] attributesByName] allKeys]; лучше, чем другие ответы спасибо!

3. @Matthias как я должен получить объекты отношений в том же словаре?

Ответ №2:

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

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

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

Ответ №3:

Версия swift на случай, если кому-то это понадобится

 import CoreData 
extension NSManagedObject {
    func toDict() -> [String:Any] {
        let keys = Array(entity.attributesByName.keys)
        return dictionaryWithValues(forKeys:keys)
    }
}