Основные данные Хранение ненужных данных - PullRequest
0 голосов
/ 09 августа 2011

Я пытаюсь разобрать API погоды Google. Я использую парсер nsxml для получения дат, погоды и т. Д. Из API, а затем сохраняю их в Core Data.

Я пытаюсь извлечь даты из анализатора, сопоставить их с текущей датой, а затем сохранить только столько информации, сколько нам нужно.

Скажем, сегодняшняя дата 08/09/2011 и дата разбора совпадает. Я хочу хранить только 2 информации из парсера в Core Data. Я пытаюсь сохранить только эти даты, но я получаю всю 4 информацию для хранения в Базовых данных.

Если я сообщу 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 голосов
/ 10 августа 2011

Код по ссылке не отформатирован и его очень сложно прочитать.Однако я обнаружил одну серьезную проблему.

Этот предикат всегда будет неудачным:

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

... если значения startDate и endDate не идентичны.Вы не можете проверить одно и то же имя ключа по двум разным значениям и ожидать, что оно пройдет.

Так как выборка возвращает только те объекты, которые передают предикат, предикат, который всегда терпит неудачу, всегда возвращает ноль объектов.

Поскольку вы, очевидно, используете предикат для поиска существующих объектов, которые уже содержат проанализированные данные, всегда предикат, который не работает, означает, что ваш код всегда думает, что ему нужно создать новый управляемый объект.Вот почему ваш объектный граф заполняется объектами с дублирующимися значениями.

...