获取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。