2013-02-26 93 views
2

我想從JSON文件中讀取數據並將其存儲到sqlite中。我正在通過「簡單」數據,但我無法弄清楚如何從我的數組中獲取一對多關係項目到sqlite中。從核心數據一對多關係JSON數組填充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解析器的工作......但我無法弄清楚如何讓一個一對多PlayerInfo進入sqlite。

我知道seasonInfo.players = [obj objectForKey:@「players」];行是錯誤的...只是不知道該怎麼辦。

溫柔......我是一個iOS新手。

回答

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端的一對多關係。

您還可以將個人PlayerInfo對象添加到SeasonInfo的玩家關係集中,但是我發現更加混淆的是,只是從多個背後的每個實體之間添加關係。

+0

真棒!這很好。謝謝您的幫助。 – 2013-02-26 04:47:50