获取NSManagedObject的属性作为NSDictionary
如果我有一个从上下文中获取的NSManagedObject,如何从动态属性中创建NSDictionary,而不是只显式地将每个字段复制到字典中?
如果我的托管对象看起来像这样,例如:
@implementation Track @dynamic artist; @dynamic group; @dynamic purchase_url; @dynamic title; @dynamic file_name; @dynamic year; @end
从数据库中取出后,在这种情况下,我需要一个NSDictionary,其中每个@dynamic属性都设置了相同的属性。
有一种更快的方法可以将NSManagedObject转换为NSDictionary(来自Matthias Bauch的响应, 请访问https://stackoverflow.com/a/5664745/2294824 ):
NSArray *keys = [[[myObject entity] attributesByName] allKeys]; NSDictionary *dict = [myObject dictionaryWithValuesForKeys:keys];
您可以通过以下方法实现您的方法:
unsigned int count; objc_property_t *properties = class_copyPropertyList([CoreDataObject class], &count); NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:16]; for(int i = 0; i < count; i++) { objc_property_t property = properties[i]; NSString *name = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding]; id obj = [coreDataObjectInstance valueForKey:name]; if (obj) { // Skip properties with nil values (optionally you can use: [dictionary setObject:((obj == nil) ? [NSNull null] : obj) forKey:name]; without any if-statement) [dictionary setObject:obj forKey:name]; } } free(properties);
“CoreDataObject”是您希望转换为NSDictionary的核心数据对象,而“coreDataObjectInstance”是此核心数据对象的实例。 请记住,您必须:
#include
此外,如果您能够通过这个想法为我们提供更多见解,那将会很棒,也许有一个不同的/更好的解决方案。
希望这可以帮助!
我认为这正是你真正想要的:
NSEntityDescription *trackEntity = [NSEntityDescription entityForName:[Track entityName] inManagedObjectContext:yourMOC];
然后你可以访问这些词典:
[trackEntity propertiesByName]; [trackEntity relationshipsByName]; [trackEntity attributesByName];
这些词典中的每一个都将具有与该属性相对应的键,并且该值将是NSPropertyDescription。