从Coredata中删除对象

时间:2011-10-09 23:26:35

标签: objective-c ios parsing

在我的应用程序中,我有一个包含评论和特色对象的Place实体,我的应用程序在每次解析我的xml数据时都会不断刷新这些,但是我需要在重新解析之前删除评论和特色对象。我的代码如下,我相信我需要在顶部的parseXML方法中删除对象:

-(void)parseXML:(NSString*)xml{


    TBXML * tbxml = [TBXML tbxmlWithXMLString:xml];

    if(tbxml.rootXMLElement){
        [self traverseElement:tbxml.rootXMLElement];

        if(self.tempItem){
            NSLog(@"Ending Application");
           [self configurePlaceChildrenAndSave];  
            [self startGeoCodingQueue];            
        }
    }

}

-(void)fireGeocoder:(BSForwardGeocoder*)g{
    NSLog(@"Begining FGC for %@ (%@)",g.searchQuery,g.metaData);
    [g findLocation];
}




-(void)startGeoCodingQueue{


  [[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithBool:YES] forKey:kGeoCoderInProgress];

    int i = 0;
    BSForwardGeocoder * fgc;

    NSArray * a = [CoreDataBasicService fetchResultsForEnity:@"Place" andSortDiscriptor:@"name" Ascending:YES];

    for (Place * p in a) {

        if(p.latitude && p.longitude)continue;//skip geocoding if location data exists

        fgc = [[BSForwardGeocoder alloc] initWithDelegate:self];
        fgc.metaData = p.name;
        fgc.searchQuery = p.postcode;  

        NSLog(@"gc:%i-%i",i,[a count]);
        if([a count] == i+1){
          fgc.last = YES;  
        }

        float delay = (float)i*kGeoCoderDelay;
        [self performSelector:@selector(fireGeocoder:) withObject:[fgc autorelease] afterDelay:delay];   

        fgc = nil;

        i++;
    }  



  [[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithInt:i] forKey:kGeoCoderCompletedKey];
}


-(void)finishedGeocoding{

  [[NSUserDefaults standardUserDefaults] setValue:[NSDate date] forKey:kGeoCoderlastRanKey];

  [[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithBool:NO] forKey:kGeoCoderInProgress];

  [[NSNotificationCenter defaultCenter] postNotificationName:kGeoCoderNotificationName object:nil];
}

-(void)forwardGeocoderError:(BSForwardGeocoder *)geocoder errorMessage:(NSString *)errorMessage{
    NSLog(@"EX ERROR: GEOCODER FAILED - %@",errorMessage);

    if(geocoder.last)[self finishedGeocoding];

}

- (void)forwardGeocoderFoundLocation:(BSForwardGeocoder*)geocoder
{
    if(geocoder.status == G_GEO_SUCCESS)
    {           
        BSKmlResult *result = [geocoder.results lastObject];            

        if(!result)return;

        //[self.fowardGeocodingQueue setObject:[NSString stringWithString:value] forKey:self.tempItem.name];
        Place * p = [CoreDataBasicService fetchPlaceNamed:geocoder.metaData];

        p.latitude = [NSNumber numberWithFloat:result.latitude];
        p.longitude = [NSNumber numberWithFloat:result.longitude]; 

        [CoreDataBasicService saveChanges];

    //NSLog(@"%@ - %f,%f",p2.name,p2.latitude,p2.longitude);

        NSLog(@"completed Foward geocoding for '%@' (%@) [%f,%f]",geocoder.metaData,geocoder.searchQuery,[p.latitude floatValue],[p.longitude floatValue]);

        if(geocoder.last)[self finishedGeocoding];      


    }
    else {

        NSString *message = @"";

        switch (geocoder.status) {
            case G_GEO_BAD_KEY:
                message = @"The API key is invalid.";
                break;

            case G_GEO_UNKNOWN_ADDRESS:
                message = [NSString stringWithFormat:@"Could not find %@", geocoder.searchQuery];
                break;

            case G_GEO_TOO_MANY_QUERIES:
                message = @"Too many queries has been made for this API key.";
                break;

            case G_GEO_SERVER_ERROR:
                message = @"Server error, please try again.";
                break;
            default:
                break;
        }




        NSLog(@"ERROR: GEOCODER FAILED - %@",message);

//      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Information" 
//                                                      message:message
//                                                     delegate:nil 
//                                            cancelButtonTitle:@"OK" 
//                                            otherButtonTitles: nil];
//      [alert show];
//      [alert release];
    }
}



-(void)configurePlaceChildrenAndSave{
    if(self.tempReviewArray.count==0 && self.tempReview)[self.tempReviewArray addObject:self.tempReview];

    if(self.tempFeatureArray.count==0 && self.tempFeature)[self.tempFeatureArray addObject:self.tempFeature];

    [self.tempItem setReviews:self.tempReviewArray];   
    [self.tempItem setFeatured:self.tempFeatureArray];    

    self.tempReviewArray = nil;
    self.tempReview = nil;
    self.tempFeatureArray = nil;
    self.tempFeature = nil;

    [CoreDataBasicService saveChanges];
    self.tempItem = nil; 
}

-(NSString*)formatKeyForCoreData:(NSString*)elementKey{
    return [elementKey stringByReplacingOccurrencesOfString:@"-" withString:@""];
}


-(NSDate*)convertStringDateToDate:(NSString*)stringDate{

    NSDateFormatter * df = [[NSDateFormatter alloc] init];
    NSLog(@"DATE:%@",stringDate);
    [df setDateFormat:@"y-M-d'T'H:m:s'Z'"];
    NSDate * d = [df dateFromString:stringDate];
    [df release];
    return d;
}


-(Place*)getPlaceForName:(NSString*)name{
  NSPredicate * pred = [NSPredicate predicateWithFormat:@"name = %@",name];            
  NSArray * results = [CoreDataBasicService fetchResultsForEnity:@"Place" WithPredicate:pred andSortDiscriptor:@"identifier" Ascending:YES];  
  return [results lastObject];
}



-(void)traverseElement:(TBXMLElement *)element {

    do {
        // Display the name of the element
        NSString * value = [TBXML textForElement:element];
        NSLog(@"%@-'%@'",[TBXML elementName:element],value);
        // Obtain first attribute from element

        NSString * ele = [TBXML elementName:element];

        if([ele isEqualToString:@"place"]){
            if(self.tempItem){
                //GEOCODER HERE
                [self configurePlaceChildrenAndSave];
            }

            //CREATE NEW CD ITEM HER       

          if(dataBaseExits){

            TBXMLElement * idElement = [TBXML childElementNamed:@"name" parentElement:element];
            Place * p = [self getPlaceForName:[NSString stringWithFormat:@"%@",[TBXML textForElement:idElement]]];            

            if(p){
              [self setTempItem:p];

              TBXMLElement * reviewsElement = [TBXML childElementNamed:@"reviews" parentElement:element]; 
              if(reviewsElement){
              self.tempItem.reviews = nil;
              [CoreDataBasicService saveChanges];
              [self traverseElement:reviewsElement];
              }

              TBXMLElement * promosElement = [TBXML childElementNamed:@"featured-places" parentElement:element]; 
              if(promosElement){
                self.tempItem.featured = nil;
                [CoreDataBasicService saveChanges];
                [self traverseElement:promosElement];
              }

              [CoreDataBasicService saveChanges];
              continue;

            }

0 个答案:

没有答案