#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)
}
}