2012-10-06 37 views
0

我试图在应用程序从Web服务器获取响应时更新我的​​本地数据库。当应用程序从Web服务器获取更新时,我通过将ID与响应进行匹配来获取本地数据库中的数据,并获取一行并执行更新代码,但本地数据库不会更新,也不会发生错误。 应该是什么解决方案?使用核心数据进行数据库更新

-(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]); 
      } 
     // } 

    } 
} 

回答

0

除了修改您的谓语用@马丁

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

注意,在两种情况下,你使用非匹配的密钥更新对象的建议:这种情况发生的id和event_id,以及对于invite_status和invite_status。

+0

谢谢你的答案,但我有差异键名称,然后服务器数据库,这就是为什么我使用差异键名称更新。 – user7388

0

你不能在predicateWithFormat使用stringWithFormat。你的断言或许应该是这样的:

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

谢谢,但我使用谓词从我的本地数据库中获取行,我得到了完美匹配的行,所以我不认为谓词有问题。问题只是那个行不能更新。 – user7388