核心数据存储不必要的数据

时间:2011-08-09 13:54:47

标签: iphone core-data google-weather-api

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

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

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

如果我给08/11/2011,我应该只获得3天的信息而不是4.但我无法做到这一点。我发布了我的示例代码。我正在使用testcase来检查我的应用程序。

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

1 个答案:

答案 0 :(得分:0)

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

此谓词将始终失败:

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

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

因为,fetch只返回那些传递谓词的对象,总是失败的谓词总是返回零对象。

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