Storing NSManagedObject in a dictionary (NSDictionary)

喜夏-厌秋 提交于 2019-12-03 04:22:50

问题


I have a custom class, which is a subclass of NSManagedObject. I would like to store it in a dictionary, but when trying to do so I receive a Property list invalid for format: 200 error.

Here is how I try to create the dictionary:

NSDictionary *dictionary = 
    [NSDictionary dictionaryWithObject: voiceMemo forKey:@"voiceMemo"];

Same result when trying

NSDictionary *dictionary = 
    [NSDictionary dictionaryWithObject: (NSData *) voiceMemo forKey:@"voiceMemo"];

It works, however, when trying to save the individual attributes separately:

NSDictionary *dictionary = 
    [NSDictionary dictionaryWithObject: voiceMemo.attribute forKey:@"attribute"];

NSDictionary should be able to store data objects, so I'm guessing, the real question is how to cast an NSManagedObject object to NSData


回答1:


Are you sure the error happens when you create the dictionary like it is implied by the code you have posted?

Property list invalid for format: 200 sounds like you try to write your NSManagedObject to the file system. Which won't work, because NSManagedObjects don't confirm to NSCoding.

You could save the attributes of the NSManagedObject in a NSDictionary, and save this dictionary to a file..

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

and when you want to restore it you set the values of your managedObject like this:

[myObject setValuesForKeysWithDictionary:dict];



回答2:


In my app I'm also storing MO's in a dictionary (but no hold on, I'm storing in an array) but without any cast. please try if this happens for an array too.

And you can try to create the dictionary first and after that assign objects.

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



回答3:


A swift version in case anyone needs it

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


来源:https://stackoverflow.com/questions/5664423/storing-nsmanagedobject-in-a-dictionary-nsdictionary

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!