2012-04-26 6 views
15

コンテキストからフェッチしたNSManagedObjectがある場合、各フィールドを辞書に明示的にコピーするだけで動的プロパティからNSDictionaryを作成するにはどうすればよいですか?NSManagedObjectのプロパティをNSDictionaryとして取得

私の管理対象オブジェクトは、例えば、次のようになります場合:

@implementation Track 

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

@end 

データベースから取り出した後、このケースでは、私はそれらの@dynamicの各プロパティに設定された同じプロパティを持つNSDictionaryのを必要としています。あなたは次のような方法であなたのアプローチを実現することができ

+1

あなたはこれをしたい理由についての詳細を与えることができる、より良い方法があるかもしれませんあなたが望むものを達成してください。その間、NSEntityDescriptionとattributesByNameを見てください。 – jrturton

+1

[この記事](http://vladimir.zardina.org/2010/03/serializing-archivingunarchiving-an-nsmanagedobject-graph/)をご覧ください。また、関係についてもあなたをカバーしています。 – Alladinian

答えて

46

https://stackoverflow.com/a/5664745/2294824Matthias Bauch応答から)NSDictionaryのにNSManagedObjectを変換するより高速な方法があります:

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

この回答をお寄せいただきありがとうございます。 –

+0

これは逆ですか? NSdictionaryをCoreDataに変換する – Nil

+1

リバースは答えのリンクに説明されています:[myObject setValuesForKeysWithDictionary:dict] – Werewolf

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は、」コア・データは、あなたが「coreDataObjectInstance」は、このコアデータオブジェクトのインスタンスである一方、NSDictionaryのに変換したいオブジェクトです。 あなたがする必要がある点に注意してください:あなたは私たちにあなたがこのアイデアを実現したいと思いますどのようないくつかのより多くの洞察力を与えることができれば

#include <objc/runtime.h> 

さらに、それは素晴らしいことだ、多分異なる/よりよい解決策があります。

希望すると便利です。

+0

これを使用することについて詳細を教えてください。インスペクタウィンドウを作成したいので、nsmanagedobjectサブクラスを使用してテーブルに行を選択すると、インスペクタウィンドウにはこのmanagedObjectのプロパティが表示されます3列の話:プロパティ名、プロパティタイプ "文字列、int ..."と小道具値 あなたはこのシナリオを達成するための最良の方法は何と思いますか? – AMTourky

6

私は、これはあなたが実際に探しているものだと思う:

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

、あなたはこれらの辞書へのアクセス権を持っている:

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

これらの辞書の各プロパティに対応するキーを持つことになり、値はNSPropertyDescriptionになります。

+0

relationshipsByNameは、NSRelationshipDescriptionオブジェクトの値の辞書を返します。 –

関連する問題