2

私はこの形式で私に来るいくつかの JSON を解析しています:

{
dataId = "823o7tr23d387g";
category = "link";
details = {
    text = "Some text associated with the link";
    url = "http://www.url.com";
    thumbnail_url = "http://www.url.com/picture.jpeg";
};
source = "CNN";
},
{
...
},

MagicalRecord には優れたインポート方法がありますが、適切なプロパティに+ (id) importFromObject:(id)data;自動的にマップできるように、JSON ディクショナリ内のディクショナリをサポートしていますか?details {}

命名規則または使用する必要があるものはありますか?

4

2 に答える 2

5

MagicalRecordを使用してJSONを自動的にインポートする方法についてのこの記事、特にデータキーパスサポートセクションを確認してください。

http://www.cimgf.com/2012/05/29/importing-data-made-easy/

データキーパスのサポート

Key Value Codingは、Objective Cの一般的で効果的なツールです。MagicalImportを使用すると、mappedKeyNameの一部としてkeyPathsを指定できるため、この機能の一部にアクセスできます。KVCに精通している場合、Magicalmportがこれらの指定されたキーを内部のKVCメソッドに渡したため、これはかなり簡単な機能であるはずです。キーパスのサポートにより、データモデルとまったく同じ階層を持たない可能性のあるエンティティにデータをマップできます。たとえば、データエンティティは緯度と経度を格納できますが、ソースデータは次のようになります。

{
  "name": "Point Of Origin",
  "location":
  {
    "latitude": 0.00,
    "longitude": 0.00
  }
}

この場合、mappedKeyName構成でデータインポートキーパスとしてlocation.latitudeとlocation.longitudeを指定して、ネストされたデータ構造を掘り下げ、それらの値をコアデータエンティティに具体的にインポートできます。

于 2012-08-21T14:52:21.720 に答える
2

スコットが言及したブログは、MagicalRecordを使用する人にとって必読です。

さらに、デフォルト+ (id) importFromObject:(id)dataが一部のNSDictionaryデータで機能しない場合は- (BOOL) importValuesForKeysWithObject:(id)objectData、NSManagedObjectサブクラスのメソッドをいつでもオーバーライドして、マッピングを正確に制御できます。

これが私の最近のプロジェクトの1つからの抜粋です:

// override MagicalRecord's implementation with additional set up for Dialogue relationship
- (BOOL) importValuesForKeysWithObject:(id)objectData {
    BOOL result = [super importValuesForKeysWithObject:objectData];

    // update lesson-dialogue data
    id dialogueDicts = [objectData objectForKey:@"dialogue"];
    if ([dialogueDicts isKindOfClass:[NSArray class]]) {
        for (id dialogueDict in dialogueDicts) {
            DialogueSentence *dialogue = [DialogueSentence findFirstByAttribute:@"id" withValue:[[dialogueDict objectForKey:@"id"]];
            if (dialogue == nil) {
                dialogue = [DialogueSentence createEntity];
            }
            [dialogue importValuesForKeysWithObject:dialogueDict];
            [self addDialoguesObject:dialogue];    // connect the relationship
        }
    }

    return result;
}

ちなみに、NSManagedObjectサブクラスのカテゴリを作成し、そこにオーバーライドコードを記述したい場合があります。これは、Core DataモデルバージョンをアップグレードしてNSManagedObjectサブクラスを再生成するときに、独自のコードが消去されないためです。

于 2012-08-21T15:11:42.267 に答える