Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 获取NSManagedObject作为NSDictionary的属性_Objective C_Ios_Core Data - Fatal编程技术网

Objective c 获取NSManagedObject作为NSDictionary的属性

Objective c 获取NSManagedObject作为NSDictionary的属性,objective-c,ios,core-data,Objective C,Ios,Core Data,如果我有一个从上下文中获取的NSManagedObject,我如何从它的动态属性中创建一个NSDictionary,而不只是将每个字段显式地复制到字典中 例如,如果我的托管对象如下所示: @implementation Track @dynamic artist; @dynamic group; @dynamic purchase_url; @dynamic title; @dynamic file_name; @dynamic year; @end 从数据库中提取后,在本例中,我需要一个

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

例如,如果我的托管对象如下所示:

@implementation Track

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

@end

从数据库中提取后,在本例中,我需要一个NSDictionary,其中每个@dynamic properties都设置了相同的属性。

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

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);
无符号整数计数;
objc_property_t*properties=class_copyPropertyList([CoreDataObject类],&count);
NSMutableDictionary*dictionary=[NSMutableDictionary字典容量:16];
for(int i=0;i
“CoreDataObject”是要转换为NSDictionary的核心数据对象,而“coreDataObjectInstance”是此核心数据对象的实例。 请记住,您必须:

#include <objc/runtime.h>
#包括
此外,如果您能给我们提供更多的见解,您希望通过这个想法实现什么,那就太好了,也许有一个不同/更好的解决方案


希望这有帮助

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

NSEntityDescription *trackEntity = [NSEntityDescription entityForName:[Track entityName] inManagedObjectContext:yourMOC];
然后您可以访问这些词典:

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

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

有一种更快的方法可以将NSManagedObject转换为NSDictionary(从位于的响应):


注意
Swift 4.2
更新

let keys = Array(YOUR_MANAGED_OBJECT.entity.attributesByName.keys)
let data:[String: Any] = YOUR_MANAGED_OBJECT.dictionaryWithValues(forKeys: keys)

如果你能详细说明你为什么要这样做,也许有更好的方法来实现你的目标。同时,请查看NSEntityDescription和attributesByName。它还涵盖了任何关系。我想与您分享我在中可能使用的详细信息,我想创建一个inspector窗口,因此,如果您在一个填充了nsmanagedobject子类的表中选择了一行,inspector窗口将以三列显示此managedObject的属性:属性名称、属性类型“字符串,int…”。。。“和prop value您认为实现此方案的最佳方法是什么?”RelationshipByName返回一个属于nsrrelationshipDescription对象的值字典…感谢您的回答,它帮助我解决了一个长期存在的问题。是否有相反的方法?NSdictionary到CoreData?答案:[myObject setValuesForKeysWithDictionary:dict]的链接中描述了相反的情况:这太棒了!在看到这一点之前,我正准备迭代槽键…Swift 5:
让数据=您的\u托管\u对象。字典WithValues(forKeys:您的\u托管\u对象。attributeKeys)
let keys = Array(YOUR_MANAGED_OBJECT.entity.attributesByName.keys)
let data:[String: Any] = YOUR_MANAGED_OBJECT.dictionaryWithValues(forKeys: keys)