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我做錯了嗎?任何建議,將不勝感激。
使用了'self.fetchedResultsController'在吸氣的原因嗎?我只是在那裏到處使用'_fetchedResultsController'。 – Fogmeister
總是很好,先排除簡單的事情我猜..你確定你正在NSFetchedResultsController正在使用相同的NSManagedObjectContext創建新的對象嗎? (考慮到它不適用於插入,但是在刪除或更新時) – oehman
您也可以嘗試刪除謂詞,並查看是否更改了任何內容。 – oehman