2014-03-27 207 views
2

我使用NSFetchedResultController在我app.But NSFetchedResultController delegate方法時,我插入新的記錄不會被調用core data之中,但它工作時,我試圖刪除或更新現有records.Here是我的代碼 -NSFectchedResultController委託不被調用?

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 


    //fetch friends from DB 
    AppDelegate* appDelegate = [UIApplication sharedApplication].delegate; 
    self.managedObjectContext = appDelegate.managedObjectContext; 

    NSError *error; 
    if (![[self fetchedResultsController] performFetch:&error]) { 
     // Update to handle the error appropriately. 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     exit(-1); // Fail 
    } 
} 

- (NSFetchedResultsController *)fetchedResultsController { 

    if (_fetchedResultsController != nil) { 
     return _fetchedResultsController; 
    } 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription 
            entityForName:@"Friends" inManagedObjectContext:self.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    [fetchRequest setFetchBatchSize:20]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat: @"status == 0"]; 
    [fetchRequest setPredicate:predicate]; 

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] 
           initWithKey:@"userId" ascending:NO]; 
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 

    NSFetchedResultsController *theFetchedResultsController = 
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
             managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil 
                cacheName:@"Root"]; 
    self.fetchedResultsController = theFetchedResultsController; 
    _fetchedResultsController.delegate = self; 

    return _fetchedResultsController; 

} 

這對於保存/更新/刪除 -

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 

    if (alertView.tag == 1001) { 

     if (buttonIndex == 0) { // add new friend 

      NSString* fid = [[alertView textFieldAtIndex:0].text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
      if (fid.length == 0) { 

       [AppDelegate showInfoAlert:@"Please enter friends's ID."]; 
       return; 
      } 
      NSString* userid = [[NSUserDefaults standardUserDefaults] valueForKey:@"userId"]; 

      NSString* req = [JSONCreator getAddFriendEnc:myId andFid:fid]; 

      if ([fid isEqualToString:userid]) { 

       [AppDelegate showInfoAlert:@"Please enter your friends's ID."]; 
       return; 
      } 
      [ConnectionManager invokeAsync:@"GET" body:req request:@"/friends" viewForHud:self.view completion:^(NSDictionary* res, NSString* error){ 

       if (error) { 

        UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Error!" message:error delegate:Nil cancelButtonTitle:@"OK" otherButtonTitles:Nil, nil]; 
        [alert show]; 
       } 
       else 
       { 

        Friends * newEntry = [NSEntityDescription insertNewObjectForEntityForName:@"Friends" inManagedObjectContext:managedObjectContext]; 
        newEntry.userId = userid; 
        newEntry.friendId = fid; 
        newEntry.status = @"0"; 

        NSError *error; 
        if (![managedObjectContext save:&error]) { 
         NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); 
        } 
        //[managedObjectContext insertObject:newEntry]; 
        //[self.frindsTable reloadData]; 
        UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Success!" message:[res valueForKey:@"response"] delegate:Nil cancelButtonTitle:@"OK" otherButtonTitles:Nil, nil]; 
        [alert show]; 
       } 
      }]; 
     } 
    } 
    else if (alertView.tag == 1002){ // delete friend 

     NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:selectedIndexPath]; 
     [managedObjectContext deleteObject:managedObject]; 
     [managedObjectContext save:nil]; 
     [NSFetchedResultsController deleteCacheWithName:nil]; 

     UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Success!" message:@"Friend removed from your friend list." delegate:Nil cancelButtonTitle:@"Ok" otherButtonTitles:Nil, nil]; 
     [alert show]; 
    } 
    else if (alertView.tag == 1003){ // update friend 


     NSString* req = [JSONCreator getBlockFriendEnc:myId andFid:frndtoBlock]; 

     [ConnectionManager invokeAsync:@"GET" body:req request:@"/friends" viewForHud:self.view completion:^(NSDictionary* res, NSString* error){ 

      if (error) { 

       UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Error!" message:error delegate:Nil cancelButtonTitle:@"OK" otherButtonTitles:Nil, nil]; 
       [alert show]; 
      } 
      else 
      { 
       NSString* userid = [[NSUserDefaults standardUserDefaults] valueForKey:@"userId"]; 
       Friends* newFriend; 
       NSError * error; 
       NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init]; 
       [fetchRequest setEntity:[NSEntityDescription entityForName:@"Friends" 
                inManagedObjectContext:managedObjectContext]]; 
       [fetchRequest setFetchLimit:1]; 

       [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"(userId == %@) && (friendId == %@)",userid, frndtoBlock]]; 

       if ([managedObjectContext countForFetchRequest:fetchRequest error:&error]) 
        newFriend = [[managedObjectContext executeFetchRequest:fetchRequest error:&error] lastObject]; 

       newFriend.status = @"1"; 


       // save 
       if (! [managedObjectContext save:&error]) 
        NSLog(@"Couldn't save data to %@", NSStringFromClass([self class])); 

       [NSFetchedResultsController deleteCacheWithName:nil]; 

       UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Success!" message:@"Friend blocked from your friend list." delegate:Nil cancelButtonTitle:@"Ok" otherButtonTitles:Nil, nil]; 
       [alert show]; 
      } 
     }]; 

    } 

} 

數據被保存到數據庫,但表視圖不會reloaded.what我做錯了嗎?任何建議,將不勝感激。

+0

使用了'self.fetchedResultsController'在吸氣的原因嗎?我只是在那裏到處使用'_fetchedResultsController'。 – Fogmeister

+0

總是很好,先排除簡單的事情我猜..你確定你正在NSFetchedResultsController正在使用相同的NSManagedObjectContext創建新的對象嗎? (考慮到它不適用於插入,但是在刪除或更新時) – oehman

+2

您也可以嘗試刪除謂詞,並查看是否更改了任何內容。 – oehman

回答

1

我想這個問題是

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"status == 0"]; 

改變這種與

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"status == '0'"]; 

希望這將有助於..