2012-10-06 3 views
0

J'essaie de mettre à jour ma base de données locale lorsque l'application reçoit une réponse du serveur Web. Lorsque l'application reçoit la mise à jour du serveur Web, j'obtiens les données de la base de données locale en faisant correspondre l'ID avec la réponse et obtenons une ligne et exécutons le code de mise à jour mais la base de données locale n'est pas mise à jour et ne génère pas d'erreur. Quelle devrait être la solution ???Mise à jour de la base de données à l'aide des données de base

-(void)checkID:(NSMutableDictionary *)dict 
{ 
    NSDictionary *dictEvent = [dict objectForKey:@"Event"]; 

    NSManagedObjectContext *context = [self managedObjectContext]; 

    NSManagedObject *selectedManagedObject = nil; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Events" inManagedObjectContext:context]; 
    NSSortDescriptor *sortDescObj = [[NSSortDescriptor alloc] initWithKey:@"event_id" ascending:YES]; 
    NSError *error = nil; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"user_id=%@ and event_id=%@",[NSNumber numberWithInt:[[dictEvent valueForKey:@"user_id"] intValue]],[NSNumber numberWithInt:[[dictEvent valueForKey:@"id"] intValue]]]]; 

    NSLog(@"Predicate = %@",predicate); 

    NSArray *arrSortDescriptors = [NSArray arrayWithObject:sortDescObj]; 
    [fetchRequest setSortDescriptors:arrSortDescriptors]; 

    [fetchRequest setEntity:entity]; 
    [fetchRequest setReturnsDistinctResults:YES]; 

    [fetchRequest setPredicate:predicate]; 

    NSArray *arrResult = [context executeFetchRequest:fetchRequest error:&error]; 

    if ([arrResult count]>0) 
    {     
      NSArray *arrKey = [dictEvent allKeys]; 
      NSArray *arrValue = [dictEvent allValues]; 

      NSLog(@"ArrKey : %@\nArrValue : %@",arrKey,arrValue); 

      selectedManagedObject = [arrResult objectAtIndex:0]; 


      for(int i = 0; i < [arrKey count] ; i++) 
      { 
       NSLog(@"selectedMng :- %@",selectedManagedObject); 
       NSLog(@"KEY: %@\t: %@",[arrKey objectAtIndex:i],[arrValue objectAtIndex:i]); 
       if ([[arrKey objectAtIndex:i]isEqualToString:@"id"]) 
       { 
        [selectedManagedObject setValue:[arrValue objectAtIndex:i] forKey:@"event_id"]; 
       } 
       else if([[arrKey objectAtIndex:i]isEqualToString:@"invited_status"]) 
       { 
        [selectedManagedObject setValue:[arrValue objectAtIndex:i] forKey:@"invite_status"]; 
       } 
       else 
       { 
        [selectedManagedObject setValue:[arrValue objectAtIndex:i] forKey:[arrKey objectAtIndex:i]]; 
       } 

      } 
      if (! [selectedManagedObject.managedObjectContext save:&error]) 
      { 
       NSLog(@"updateEntityIntoDataBaseNamed - Error :: %@", [error localizedDescription]); 
      } 
     // } 

    } 
} 

Répondre

0

Outre la modification de votre prédicat comme suggéré par @ Martin

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user_id=%@ && event_id=%@", 
    [NSNumber numberWithInt:[[dictEvent valueForKey:@"user_id"] intValue]], 
    [NSNumber numberWithInt:[[dictEvent valueForKey:@"id"] intValue]] 
]; 

noter que dans deux cas, vous mettez à jour votre objet à l'aide des touches non correspondantes: cela se produit pour id et event_id, et pour invite_status et invite_status.

+0

Merci pour les ans, mais j'ai le nom de clés diff puis la base de données du serveur, c'est pourquoi je suis mise à jour en utilisant le nom de clés diff. – user7388

0

Vous ne pouvez pas utiliser stringWithFormat dans les predicateWithFormat. Votre prédicat devrait probablement ressembler à ceci:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user_id=%@ and event_id=%@", 
    [NSNumber numberWithInt:[[dictEvent valueForKey:@"user_id"] intValue]], 
    [NSNumber numberWithInt:[[dictEvent valueForKey:@"id"] intValue]] 
]; 
+0

Merci, mais j'utilise le prédicat pour aller chercher la ligne de ma base de données locale, et j'obtiens la ligne correspondante parfaite donc je ne pense pas qu'il y ait un problème dans le prédicat. Le problème est seulement que, cette ligne ne se met pas à jour. – user7388

Questions connexes