获取NSManagedObject的属性作为NSDictionary

typ*_*ror 18 core-data objective-c ios

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

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

@implementation Track

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

@end
Run Code Online (Sandbox Code Playgroud)

从数据库中取出后,在这种情况下,我需要一个NSDictionary,其中每个@dynamic属性都设置了相同的属性.

小智 55

有一种更快的方法可以将NSManagedObject转换为NSDictionary(来自Matthias Bauch的响应,请访问/sf/answers/396532181/):

NSArray *keys = [[[myObject entity] attributesByName] allKeys];
NSDictionary *dict = [myObject dictionaryWithValuesForKeys:keys];
Run Code Online (Sandbox Code Playgroud)

  • 答案的链接中描述了反向:[myObject setValuesForKeysWithDictionary:dict] (2认同)

Mar*_*kus 10

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

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);
Run Code Online (Sandbox Code Playgroud)

"CoreDataObject"是您希望转换为NSDictionary的核心数据对象,而"coreDataObjectInstance"是此核心数据对象的实例.请记住,您必须:

#include <objc/runtime.h>
Run Code Online (Sandbox Code Playgroud)

此外,如果您能够通过这个想法为我们提供更多见解,那将会很棒,也许有一个不同的/更好的解决方案.

希望这可以帮助!


bpe*_*vic 6

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

NSEntityDescription *trackEntity = [NSEntityDescription entityForName:[Track entityName] inManagedObjectContext:yourMOC];
Run Code Online (Sandbox Code Playgroud)

然后你可以访问这些词典:

[trackEntity propertiesByName];
[trackEntity relationshipsByName];
[trackEntity attributesByName];
Run Code Online (Sandbox Code Playgroud)

这些词典中的每一个都将具有与该属性相对应的键,并且该值将是NSPropertyDescription.