2012-10-12 40 views
0

我有一個web服務,它按照以下順序返回數據。不把數據放在我的核心數據庫中

"club": { 
     -"trainingen": [ 

      { 
       "date": "12/10/2012", 
       "training": [ 
        { 
         "type": "Wedstrijd B-kern Bergen-KRC Genk", 
         "time": "19:30" 
        } 
       ] 
      }, 
      { 
       { 

    "date": "16/10/2012", 
    "training": [ 
     { 
      "type": "Training", 
      "time": "10:00" 
     }, 
     { 
      "type": "Training", 
      "time": "14:30" 
     } 
    ] 

}, 
      }, 

在我的核心數據庫中我有一個實體培訓。具有屬性:日期,屬性:類型和屬性:時間。我創建了這個實體的一個子類和一個類來將它存儲到我的數據庫中。爲了獲得webservice url,我正在做以下事情。

+ (NSArray *)getTrainingen 
{ 
    NSString *request = [NSString stringWithFormat:@"http://www.krcgenk.be/mobile/json/request/club/type/ipad"]; 
    return [[self executeGenkFetch:request] valueForKeyPath:@"club.trainingen"]; 
} 

我在這個頂部定義了我的值。

#define TRAINING_TYPE @"training.type" 
#define TRAINING_DATE @"date" 
#define TRAINING_TIME @"training.time" 

在我的分類中,我正在做以下工作。

+ (Training *)trainingWithGenkInfo:(NSDictionary *)genkInfo 
      inManagedObjectContext:(NSManagedObjectContext *)context 
         withIndex: (int)index; 
{ 
    Training *training = nil; 

    training = [NSEntityDescription insertNewObjectForEntityForName:@"Training" 
              inManagedObjectContext:context]; 

    training.type   = [[[genkInfo objectForKey:@"training"] objectAtIndex:index] objectForKey:@"type"]; 
    training.time   = [[[genkInfo objectForKey:@"training"] objectAtIndex:index] objectForKey:@"time"]; 
    training.date   = [genkInfo objectForKey:TRAINING_DATE]; 

    NSLog(@"type: %@", training.type); 
    NSLog(@"time: %@", training.time); 

    return training; 
} 

但它一直給NSLog上面的(null)。

任何人都可以幫忙嗎?

親切的問候。

編輯 這也是更多鈔票可以有多於一個爲期一天的培訓。我試過這個,但得到一個錯誤。

int trainingIndex = -1; 
    for (NSDictionary *genkInfo in trainingen) { 
      trainingIndex++;   
[Training trainingWithGenkInfo:genkInfo inManagedObjectContext:document.managedObjectContext withIndex:trainingIndex]; 

       } 
+0

根據你的JSON,「訓練」是一個列表,而不是字典。我不知道你的代碼是否應該在這種情況下工作。 – ilmiacs

回答

1

看來你使用Key-Value Coding訪問genkInfo詞典,例如與關鍵路徑「training.type」。在這種情況下,您必須使用valueForKeyPath:而不是objectForKey:,例如,

training.type = [genkInfo valueForKeyPath:TRAINING_TYPE]; 

編輯:正如我現在看到,培訓是一個數組。據我所知,你不能通過鍵值編碼來訪問數組(但我不能100%確定)。在任何情況下,你可以用

training.type = [[[genkInfo objectForKey:@"training"] objectAtIndex:0] objectForKey:@"type"] 

編輯權限值2:(這是指你更新的代碼。)您需要2個循環:爲trainingen陣列外環和內環爲訓練數組在字典中。這看起來應該大致是這樣的(有可能是拼寫錯誤或錯誤,因爲我並沒有真正運行這段代碼):

for (NSDictionary *genkInfo in trainingen) { 
    NSArray *training = [genkInfo objectForKey:@"training"]; 
    for (int i = 0; i < training.count; i++) { 
     [Training trainingWithGenkInfo:genkInfo 
       inManagedObjectContext:document.managedObjectContext 
          withIndex:trainingIndex]; 
    } 
} 

這可能不是最優的代碼,但是你應該能夠找出一個解決方案一樣這個。

備註:如果某件事不起作用,並且您收到錯誤消息,那麼您應該將確切的錯誤消息添加到您的問題中,並在代碼中找到發生消息的位置。這使其他人更容易幫助你。

+0

嗯,當我改變這個時,我得到這個錯誤:reason:'不可接受的屬性類型的值:property =「type」;期望的類型= NSString;給定類型= __NSArrayI;值=( 「Wedstrijd B-kern Bergen-KRC Genk」 )。' – Steaphann

+0

@StefGeelen:查看我更新的答案。 –

+0

這工作。但也有可能每天有超過1次的訓練。所以嘗試了上面的代碼。我更新了我的答案。但它給出了一個NSRangeException。 – Steaphann