将NSManagedObject存储在字典(NSDictionary)中

18
我有一个自定义类,它是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

你确定错误发生在你发布的代码所暗示的创建字典时吗?

Property list invalid for format: 200 听起来像是你试图将 NSManagedObject 写入文件系统。这是行不通的,因为 NSManagedObject 不符合 NSCoding 协议。

你可以将 NSManagedObject 的属性保存在一个 NSDictionary 中,并将此字典保存到文件中。

NSArray *keys = [[[myObject entity] attributesByName] allKeys];
NSDictionary *dict = [myObject dictionaryWithValuesForKeys:keys];

当你想要恢复它时,你可以像这样设置managedObject的值:

[myObject setValuesForKeysWithDictionary:dict];

你说得对,错误发生在下一行,当我试图写入数据时(在这种情况下是在UILocalNotification的userData中)。正如我在问题中所写的那样,分别保存属性确实有效,因此这解决了问题。我只是认为(或希望)有一种方法可以避免这种情况。谢谢! - antalkerekes
我在谷歌上搜索了获取键数组的方法,NSArray *keys = [[[myObject entity] attributesByName] allKeys];比其他答案更好,谢谢! - Manobala
1
@Matthias,我应该如何在同一个字典中获取关系对象? - Ameet Dhas

0
在我的应用程序中,我也将 MO 存储在字典中(但是请注意,我是存储在数组中),但没有进行任何转换。请尝试查看是否对数组也适用。
您可以尝试先创建字典,然后再分配对象。
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setValue:managedObject forKey:@"thisOne"];

0

如果有人需要的话,这是一个 Swift 版本

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接