获取 NSManagedObject 的属性作为 NSDictionary

Posted

技术标签:

【中文标题】获取 NSManagedObject 的属性作为 NSDictionary【英文标题】:Get properties of NSManagedObject as NSDictionary 【发布时间】:2012-04-26 21:13:13 【问题描述】:

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

如果我的托管对象是这样的,例如:

@implementation Track

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

@end

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

【问题讨论】:

您能否详细说明您为什么要这样做,可能有更好的方法来实现您想要的。同时,查看 NSEntityDescription 和 attributesByName。 看看this article。它还涵盖您的任何关系。 【参考方案1】:

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

NSArray *keys = [[[myObject entity] attributesByName] allKeys];
NSDictionary *dict = [myObject dictionaryWithValuesForKeys:keys];

【讨论】:

感谢您的回答,它帮助我解决了一个长期存在的问题。 这个有反面吗? NSdictionary 到 CoreData? 答案的链接中描述了反向:[myObject setValuesForKeysWithDictionary:dict] 这太棒了!在看到这个之前,我正要迭代槽键......【参考方案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>

此外,如果您能向我们提供更多见解,您希望通过这个想法实现什么,那就太好了,也许有不同/更好的解决方案。

希望这会有所帮助!

【讨论】:

我想和你分享一下我可以在什么地方使用它的细节,我想做一个检查器窗口,所以如果你在填充了 nsmanagedobject 子类的表中选择了一行,检查器窗口将在三列故事中显示此 managedObject 的属性:属性名称、属性类型“字符串、int ...”和道具值您认为实现此场景的最佳方法是什么??【参考方案3】:

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

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

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

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

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

【讨论】:

relationshipsByName 返回一个包含 NSRelationshipDescription 对象的值的字典......【参考方案4】:

注意Swift 4.2更新

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

【讨论】:

Swift 5: let data = YOUR_MANAGED_OBJECT.dictionaryWithValues(forKeys: YOUR_MANAGED_OBJECT.attributeKeys)

以上是关于获取 NSManagedObject 的属性作为 NSDictionary的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NSManagedObject 子类中使用 Transformable 属性作为其实际类型?

NSManagedObject 变为空

NSManagedObject - 如何获取属性的类型

将获取的 NSManagedObject 分配给属性

Core Data 没有触发 NSManagedObject 实例的错误作为应用程序委托的属性

如何有效地从 NSManagedObject 中获取属性的所有有效值?