2

JSONファイルからデータを読み取ってsqliteに保存しようとしています。「単純な」データを取得していますが、配列から 1 対多の関係アイテムを sqlite に取得する方法がわかりません。

ここに私のデータモデルがあります:

(申し訳ありませんが、ここでスクリーン キャプチャを行うことはできません... そこで、データ モデルの説明を以下に示します:)

    Entity: SeasonInfo 
    Attributes:
    year
    coach
    wins
    losses
    ties
        Relationship: players
        Destination: PlayerInfo
        Inverse seasonInfo

    Entity: PlayerInfo
    Attributes:
    name
    number
       Relationship: seasonInfo
       Destination: SeasonInfo
       Inverse: players

これが私のJSONです:

    [
       { "year": 2012, "wins": 8,  "losses": 8, "ties": 0, "coach": "Garrett",
          "players": [ { "name": "Tony Romo",  "number": 9},
                      { "name": "Dez Bryant",   "number": 88} ],
       },
       { "year": 2011, "wins": 8,  "losses": 8, "ties": 0, "coach": "Garrett",
         "players": [ { "name": "DeMarcu Ware",  "number": 94},
                       { "name": "Felix Jones ",  "number": 28},
                       { "name": "Miles Austin",  "number": 19} ],
        },
        { "year": 2010, "wins": 6,  "losses": 10, "ties": 0, "coach": "Garrett/Phillips",
          "players": [ { "name": "Sean Lee",      "number": 50},
                       { "name": "Jason Witten",  "number": 82} ],
        }
     ]

これが私のコードです:

    // Load JSON data into Array
    NSError* err = nil;
    NSString* dataPath = [[NSBundle mainBundle] pathForResource:@"CowboySeason" ofType:@"json"];
    NSArray* cowboySeasonsArray = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:dataPath]
                                                                  options:kNilOptions
                                                                    error:&err];
    NSLog(@"Imported Seasons: %@", cowboySeasonsArray);


    // Export data from the array into the database

    // Store the SeasonInfo 
    [cowboySeasonsArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        SeasonInfo *seasonInfo = [NSEntityDescription
                                          insertNewObjectForEntityForName:@"SeasonInfo"
                                          inManagedObjectContext:context];

        seasonInfo.year = [obj objectForKey:@"year"];
        seasonInfo.wins = [obj objectForKey:@"wins"];
        seasonInfo.losses = [obj objectForKey:@"losses"];
        seasonInfo.ties = [obj objectForKey:@"ties"];
        seasonInfo.coach = [obj objectForKey:@"coach"];

        seasonInfo.players = [obj objectForKey:@"players"];

        NSError *error;
        if (![context save:&error]) {
            NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
        }
    }];

cowboySeasonArray はログで次のようになります。

    2013-02-25 20:39:05.025 SeasonTestLoader[369:503] Imported Seasons: (
    {
    coach = Garrett;
    losses = 8;
    players =         (
                    {
            name = "Tony Romo";
            number = 9;
        },
                    {
            name = "Dez Bryant";
            number = 88;
        }
    );
    ties = 0;
    wins = 8;
    year = 2012;
},
    {
    coach = Garrett;
    losses = 8;
    players =         (
                    {
            name = "DeMarcu Ware";
            number = 94;
        },
                    {
            name = "Felix Jones ";
            number = 28;
        },
                    {
            name = "Miles Austin";
            number = 19;
        }
    );
    ties = 0;
    wins = 8;
    year = 2011;
},
    {
    coach = "Garrett/Phillips";
    losses = 10;
    players =         (
                    {
            name = "Sean Lee";
            number = 50;
        },
                    {
            name = "Jason Witten";
            number = 82;
        }
    );
    ties = 0;
    wins = 6;
    year = 2010;
}

)

JSONパーサーが機能しているように見えます...しかし、1対多のPlayerInfoをsqliteに取得する方法がわかりません。

私はシーズンを知っていますInfo.players = [obj objectForKey:@"players"]; 行が間違っています...ここで何をすべきかわかりません。

優しくしてください... 私は iOS 初心者です。

4

1 に答える 1

2

チームの「外側のループ」が機能しているように見えます。次は、各チームのプレーヤーの「内側のループ」を追加するだけです。

チームを作成するためのコードから開始し、ループ内で次のようにします。

// Other stuff from your code here, omitted for brevity
seasonInfo.ties = [obj objectForKey:@"ties"];
seasonInfo.coach = [obj objectForKey:@"coach"];

// Loop through each player, creating a new PlayerInfo entity for each one:
NSArray *playerArray = [obj objectForKey:@"players"]
[playerArray enumerateObjectsUsingBlock:^(id playerObj, NSUInteger playerIdx, BOOL *playerStop) {
    PlayerInfo *playerInfo = [NSEntityDescription
                                      insertNewObjectForEntityForName:@"PlayerInfo"
                                      inManagedObjectContext:context];

    playerInfo.seasonInfo = seasonInfo;
    playerInfo.name = [playerObj objectForKey:@"name"];
    playerInfo.number = [playerObj objectForKey:@"number"];
}];

NSError *error;
if (![context save:&error]) {
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}

PlayerInfo と SeasonInfo の間には逆の関係が設定されているため、関係のどちらかの側から接続を確立でき、もう一方の側は自動的に処理されます。この場合、新しい PlayerInfo エンティティを作成し、各エンティティの seasonInfo 値を設定することで、SeasonInfo 側の 1 対多の関係が設定されます。

個々の PlayerInfo オブジェクトを SeasonInfo のプレーヤー関係セットに追加することもできますが、多数の各エンティティからの関係を 1 つに追加するだけでは、さらに混乱することがわかります。

于 2013-02-26T04:16:22.993 に答える