1

次の関係を持つローカル JSON ファイルから読み取っています。

Country -< Venues

次の例のように、JSON ファイルにはすべての国が親として含まれ、会場が子として含まれます。

// Sample JSON (Countries have many venues)
    [{
        "id": 1,
        "name": "USA",
        "venues": [
            {
                "venue": "Von Braun Center",
                "city" : "Huntsville",
                "state": "Alabama",
                "capacity": 13760
            }
        ]
    }];

私が抱えている問題は、MagicalRecord を使用してエンティティと関係を保存したいのですが、無効なコンテキストについて不平を言い続けることです。

// Read through a JSON file then save to Core Data
        [MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *c) {
            Country *country = [Country createInContext:c];
            [country setName:name];
        } completion:^{

            for (NSDictionary *venueData in venues) {

                NSString *venue = (NSString *) [venueData objectForKey:@"venue"];
                NSString *city = (NSString *) [venueData objectForKey:@"city"];
                NSString *state = (NSString *) [venueData objectForKey:@"state"];

                Venue *v = [Venue createEntity];
                v.name = venue;
                v.city = city;
                v.state = state;
                v.country = country;

            } // next

            [[NSManagedObjectContext defaultContext] saveNestedContexts];
        }];

前編を保存したいのですcountryが、会場を国に設定した後編では使えません。

私の質問は次のとおりです。

  1. 国を保存し、国と会場オブジェクトの間に MagicalRecord を使用して関係を作成/保存するにはどうすればよいですか?

  2. 完了ブロックで国オブジェクトを機能させるにはどうすればよいですか。

どうもありがとう


SOメンバーからのアドバイスに従って、問題を1つのブロックに入れることで問題を解決することができました。

for (NSDictionary *dict in json) {
                NSString *name = (NSString *) [dict objectForKey:@"name"];
                NSArray *venueList = (NSArray *) [dict valueForKey:@"venues"];

                [MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *c) {
                    Country *country = [Country createInContext:c];
                    [country setName:name];

                    for (NSDictionary *venueData in venueList) {

                        NSString *name = (NSString *) [venueData objectForKey:@"venue"];
                        NSString *city = (NSString *) [venueData objectForKey:@"city"];
                        NSString *state = (NSString *) [venueData objectForKey:@"state"];
                        //NSNumber *capacity = (NSNumber *) [NSNumber numberWithInt:[[venueData valueForKey:@"capacity"] intValue]];

                        Venue *v = [Venue createInContext:c];
                        [v setName:name];
                        [v setCity:city];
                        [v setState:state];
                        [v setCountry:country];
                    } // next

                } completion:^{
                }];
            } // next

助けてくれたすべての人に感謝します

4

1 に答える 1