Получить свойства NSManagedObject как NSDictionary
Если у меня есть NSManagedObject, который я извлек из контекста, как я могу создать NSDictionary из его динамических свойств, не просто скопировав каждое поле в словарь явно?
Если мой управляемый объект выглядит так, например:
@implementation Track
@dynamic artist;
@dynamic group;
@dynamic purchase_url;
@dynamic title;
@dynamic file_name;
@dynamic year;
@end
После извлечения из базы данных в этом случае мне нужен NSDictionary с теми же свойствами, которые установлены для каждого из этих @dynamic-свойств.
Ответы
Ответ 1
Существует более быстрый способ преобразования NSManagedObject в NSDictionary (от ответ Маттиаса Бауха на fooobar.com/questions/285005/...):
NSArray *keys = [[[myObject entity] attributesByName] allKeys];
NSDictionary *dict = [myObject dictionaryWithValuesForKeys:keys];
Ответ 2
Вы можете достичь своего подхода, следуя методу:
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>
Кроме того, было бы здорово, если бы вы могли дать нам больше информации о том, что вы хотели бы достичь с помощью этой идеи, возможно, существует другое/лучшее решение.
Надеюсь, это поможет!
Ответ 3
Я думаю, это то, что вы на самом деле ищете:
NSEntityDescription *trackEntity = [NSEntityDescription entityForName:[Track entityName] inManagedObjectContext:yourMOC];
тогда у вас есть доступ к этим словарям:
[trackEntity propertiesByName];
[trackEntity relationshipsByName];
[trackEntity attributesByName];
каждый из этих словарей будет иметь ключи, соответствующие свойству, а значение будет обозначать NSPropertyDescription.