19

如果我有一个从上下文中获取的 NSManagedObject,我如何从它的动态属性中创建一个 NSDictionary 而不只是将每个字段显式复制到字典中?

如果我的托管对象看起来像这样,例如:

@implementation Track

@dynamic artist;
@dynamic group;
@dynamic purchase_url;
@dynamic title;
@dynamic file_name;
@dynamic year;

@end

在从数据库中获取之后,在这种情况下,我需要一个 NSDictionary,并且为每个 @dynamic 属性设置相同的属性。

4

4 回答 4

56

有一种更快的方法可以将 NSManagedObject 转换为 NSDictionary(来自https://stackoverflow.com/a/5664745/2294824上的Matthias Bauch响应):

NSArray *keys = [[[myObject entity] attributesByName] allKeys];
NSDictionary *dict = [myObject dictionaryWithValuesForKeys:keys];
于 2013-11-18T02:47:41.527 回答
11

您可以通过以下方法实现您的方法:

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 <objc/runtime.h>

此外,如果您能给我们更多的见解,您想用这个想法实现什么,那就太好了,也许有一个不同/更好的解决方案。

希望这可以帮助!

于 2012-04-26T21:46:37.730 回答
6

我认为这就是你真正想要的:

NSEntityDescription *trackEntity = [NSEntityDescription entityForName:[Track entityName] inManagedObjectContext:yourMOC];

那么您可以访问这些字典:

[trackEntity propertiesByName];
[trackEntity relationshipsByName];
[trackEntity attributesByName];

这些字典中的每一个都有对应于属性的键,值将是一个 NSPropertyDescription。

于 2013-10-31T21:11:02.570 回答
1

注意Swift 4.2更新

let keys = Array(YOUR_MANAGED_OBJECT.entity.attributesByName.keys)
let data:[String: Any] = YOUR_MANAGED_OBJECT.dictionaryWithValues(forKeys: keys)
于 2019-08-02T10:19:17.583 回答