0

Google Weather API を解析しようとしています。私は nsxml パーサーを使用して API から日付や天気などを取得し、それらを Core Data に保存しています。

私がやろうとしているのは、パーサーから日付を抽出し、それらを現在の日付と照合して、保存する必要がある情報だけを保存することです。

たとえば、今日の日付が 2011 年 8 月 9 日で、解析結果の日付が一致するとします。パーサーから Core Data に 2 つの情報のみを保存したいと考えています。これらの日付のみを保存しようとしていますが、4 つの情報すべてを Core Data に保存しようとしています。

2011 年 8 月 11 日を指定すると、4 日ではなく 3 日分の情報しか得られないはずですが、それができません。サンプルコードを投稿しています。テストケースを使用してアプリケーションをチェックしています。

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict

{  
if ([@"forecast_date" isEqualToString:elementName]) 
{

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd"];
     startDate = [formatter dateFromString:[attributeDict objectForKey:@"data"]];

    [formatter release];

 } 
  else if ([@"forecast_conditions" isEqualToString:elementName])
  {

    isParsingForecast = YES;
    isParsingInformation = NO;
    isParsingCurrent = NO;

     newdate=[startDate addTimeInterval:60*60*24*[forecastConditions count]];
     NSMutableDictionary *fields = [[NSMutableDictionary alloc] init];
    [fields setObject:newdate forKey:@"date"];
    [fields setObject:city    forKey:@"city"];
    [fields setObject:state   forKey:@"state"];
    [fields setObject:country forKey:@"country"];
      [fields setObject:startDate forKey:@"startdate"];
      //[fields setObject: forKey:<#(id)#>]
    [forecastConditions addObject:fields];
    [fields release];

}


 else if (isParsingForecast) {

    NSMutableDictionary *fields = [forecastConditions lastObject];
    NSLog(@"dic is : %@ \n\n",fields);

    [fields setObject:[attributeDict objectForKey:@"data"] forKey:elementName];

}

}

私のコード全体をここに投稿 http://www.iphonedevsdk.com/forum/iphone-sdk-development/87475-coredata-storing-more-values-than-what-required-store-database.html#post363100

4

1 に答える 1

0

リンクのコードはフォーマットされておらず、非常に読みにくいです。しかし、私は1つの大きな問題を見つけました。

この述語は常に失敗します。

  predicate = [NSPredicate predicateWithFormat:
  @"city == %@ and state == %@ and country == %@ and date==%@ and date==%@", city, state, country,startDate,endDate];

... startDate と endDate の値が同一でない場合。2 つの異なる値に対して同じキー名をテストして、それが合格することを期待することはできません。

フェッチは述語を通過したオブジェクトのみを返すため、常に失敗する述語は常にゼロ オブジェクトを返します。

述語を使用して解析済みデータが既に含まれている既存のオブジェクトを見つけているように見えるため、述語が常に失敗するということは、コードが常に新しい管理対象オブジェクトを作成する必要があると考えていることを意味します。オブジェクト グラフが重複した値を持つオブジェクトでいっぱいになるのはそのためです。

于 2011-08-09T21:16:37.227 に答える