0

我正在尝试解析谷歌天气 API。我正在使用 nsxml 解析器从 api 获取日期、天气等,然后将它们存储在 Core Data 中。

我想做的是从解析器中提取日期,将它们与当前日期匹配,然后只存储我们需要存储的尽可能多的信息。

比如说,今天的日期是 08/09/2011 并且解析匹配的日期。我希望只将解析器中的 2 个信息存储到核心数据中。我试图只存储那些日期,但我将所有 4 个信息都存储到核心数据中。

如果我给出 2011 年 8 月 11 日,我应该只得到 3 天的信息而不是 4 天。但我无法做到这一点。我正在发布我的示例代码。我正在使用测试用例来检查我的应用程序。

- (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

链接上的代码未格式化,很难阅读。但是,我确实发现了一个主要问题。

这个谓词总是会失败:

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

...如果 startDate 和 endDate 值不相同。您不能针对两个不同的值测试相同的键名并期望它通过。

因为,提取只返回那些通过谓词的对象,所以总是失败的谓词总是返回零个对象。

由于您显然正在使用谓词来查找已包含已解析数据的现有对象,因此始终失败的谓词意味着您的代码始终认为它需要创建一个新的托管对象。这就是为什么您的对象图充满了具有重复值的对象。

于 2011-08-09T21:16:37.227 回答