2012-04-26 67 views
15

如果我有一個從上下文中獲取的NSManagedObject,我怎樣才能創建一個NSDictionary的動態屬性,而不只是明確地將每個字段複製到字典中?獲取NSManagedObject的屬性作爲NSDictionary

如果我管理的對象是這樣的,例如:

@implementation Track 

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

@end 

從數據庫中獲取後,在這種情況下,我需要一個NSDictionary設置爲每個那些@dynamic相同的性能特性。

+1

您能給你爲什麼想這樣做更詳細的,有可能是一個更好的辦法實現你想要的。同時,看看NSEntityDescription和attributesByName。 – jrturton 2012-04-26 21:23:17

+1

看看[這篇文章](http://vladimir.zardina.org/2010/03/serializing-archivingunarchiving-an-nsmanagedobject-graph/)。它也涵蓋了你的任何關係。 – Alladinian 2012-04-26 21:23:21

回答

46

有一個NSManagedObject(在https://stackoverflow.com/a/5664745/2294824Matthias Bauch響應)轉換爲一個NSDictionary一個更快的方法:

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

感謝您的回答,它可以幫助我結束長期存在的問題。 – 2016-01-22 07:59:21

+0

是否有相反的情況? NSdictionary到CoreData? – Nil 2016-02-12 12:47:00

+1

反向描述的鏈接從答案:[myObject setValuesForKeysWithDictionary:dict] – Werewolf 2016-08-23 15:20:26

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); 

「CoreDataObject」爲核心的數據對象,你想轉換成的NSDictionary而「coreDataObjectInstance」這是核心數據對象的實例。 請記住,你必須:

#include <objc/runtime.h> 

此外,這將是巨大的,如果你可以給我們一些更多的見解,你想實現這個想法是什麼,也許有不同的/更好的解決方案。

希望這會有所幫助!

+0

我想與你分享一下我可以使用它的細節,我想創建一個檢查器窗口,所以如果你在填充了nsmanagedobject子類的表中選擇了一行,檢查器窗口將顯示這個managedObject的屬性在三列故事:屬性名稱,屬性類型「string,int ...」和道具值 你認爲實現這種場景的最佳方式是什麼? – AMTourky 2013-12-04 12:49:25

6

我覺得這是你實際上在尋找:

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

那麼您可以訪問這些字典:

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

這些字典將有對應的屬性鍵,並且該值將是一個NSPropertyDescription。

+0

relationshipsByName返回值爲NSRelationshipDescription對象的值的字典.... – 2015-11-18 20:59:43