2013-03-23 84 views
0

我想从另一个viewcontroller编辑nsfetchresults记录,如果我所有的数据库条目都显示,它工作正常。但是,当我按日期过滤表,并尝试对其进行编辑,我得到这个错误如何在仅显示某些记录时编辑nsfetchresults记录?

2013年3月22日23:09:02.895 easyDB [1079:907] *断言失败 - [UITableView的_endCellAnimationsWithContext:],/SourceCache/UIKit/UIKit-2380.17/UITableView.m:1070 2013-03-22 23:09:18.865 easyDB [1079:907]抓到异常!

NSInternalInconsistencyException

无效更新:在部分0的行的无效数(6)的包含在现有部分中的更新后的行 数必须 等于之前包含在该部分的行数 更新(2),加上或减去从 插入或删除的行数(0插入,0删除)以及加或减行数 移入或移出该部分的行数(移入0,0搬出)。

我通过

NSIndexPath *indexpath = (NSIndexPath*)sender; 
      GlucoseDetailViewController *glucoseDetailsVC = (GlucoseDetailViewController*)segue.destinationViewController; 
      GlucoseRecords *rec = [self.fetchedResultsController objectAtIndexPath:indexpath]; 
[glucoseDetailsVC setSentRecord:rec]; 

而且在编辑视图

[self.sentRecord setGlucose:[NSNumber numberWithInt:[[txtGlucoseReading text] intValue]]]; 

    [self.sentRecord setDate:self.dateToAdd]; 
    [self.sentRecord setMealType:[NSString stringWithString:self.strMealOption]]; 
    [self.sentRecord setQuickNote:[NSString stringWithString:self.strQuickNote]]; 
    [self.sentRecord setDeleted:[NSNumber numberWithBool:NO]]; 
    [self.sentRecord setWhoRecorded:[self.settings currentUser]]; 

    NSError *error; 
    if (![[self.settings managedObjectContext] save:&error]) 
     NSLog(@"Failed to add default user with error: %@", [error domain]); 

FetchedResults控制器发送

- (NSFetchedResultsController *)fetchedResultsController { 

    if (_fetchedResultsController != nil && [self.strCurrentEntetyName isEqualToString:self.strEntetyName] &&(self.filteChanged==[NSNumber numberWithBool:NO])) { 
     return _fetchedResultsController; 
    } 


    self.filteChanged = [NSNumber numberWithBool:NO]; 
    self.strCurrentEntetyName = [NSString stringWithString:self.strEntetyName]; 

    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:[self strEntetyName]]; 
    //NSEntityDescription *entity = [NSEntityDescription 
    //        entityForName:@"Records" inManagedObjectContext:[self.settings managedObjectContext]]; 

    if (self.isDateFilterSet==[NSNumber numberWithBool:NO]) 
    { 

    fetchRequest.predicate = [NSPredicate predicateWithFormat:@" whoRecorded.username = %@ AND deleted=0", [self.settings.currentUser username]]; 
    } 
    else 
    { 
     fetchRequest.predicate = [NSPredicate predicateWithFormat:@" (whoRecorded.username = %@) AND (deleted = 0) AND (date =>%@) AND (date<=%@)", [self.settings.currentUser username],self.dateMinSetFilter ,self.dateMaxSetFilter]; 


    } 

    NSLog(@"User:%@",[self.settings.currentUser username]); 

    // [fetchRequest setEntity:entity]; 

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

    [fetchRequest setFetchBatchSize:100]; 

    NSFetchedResultsController *theFetchedResultsController = 
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
             managedObjectContext:[self.settings managedObjectContext] sectionNameKeyPath:nil 
                cacheName:nil]; 
    self.fetchedResultsController = theFetchedResultsController; 




    _fetchedResultsController.delegate = self; 




    return _fetchedResultsController; 

} 

我的理解是什么问题,但我不能看到解决它的任何好方法。我可以重置表格以在编辑前显示所有条目,但我不认为这是一个好的解决方案。有没有更好的方法来解决这个问题?

谢谢

+0

请发表您的fetchedResultsController代码。 – 2013-03-23 05:52:52

+0

已发布,谢谢! – user2067051 2013-03-23 06:32:36

回答

0

找到答案!

[self.tableView updateConstraintsIfNeeded]; 

所需此行添加到

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
0

你是怎么'只显示一些记录'?使用NSPredicate来过滤结果或其他内容?

我认为你需要找到问题,是否因为你从另一个视图控制器操作一个tableview?

+0

是的,我按日期过滤它。对不起,不清楚。我已经将该代码添加到问题 – user2067051 2013-03-23 05:31:53

0

试试这个代码:

调用解析方法,请写之前:self.fetchedResultsController = nil;

- (NSFetchedResultsController *)fetchedResultsController // attaches an NSFetchRequest to this UITableViewController 
{ 
    if (_fetchedResultsController != nil) 
    { 
     return _fetchedResultsController; 
    } 

    NSLog(@"Length:: %d",[[_fetchedResultsController mutableCopy] length]); 

    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"YourEntityName"]; 
    [fetchRequest setIncludesSubentities:YES]; 

    // Sort by Application name 
    NSSortDescriptor* sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]; 
    //Sort by CommandNameloca 
    NSArray* sortDescriptors = [[NSArray alloc] initWithObjects: sortDescriptor1, nil]; 
    [fetchRequest setSortDescriptors:sortDescriptors]; 

    [fetchRequest setFetchBatchSize:100]; 

    tempArr=[[NSMutableArray alloc]initWithArray:sortDescriptors]; 

    NSLog(@"****----- tempArr Count == %d",[tempArr count]); 

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"date" cacheName:@"Master"]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 

    NSError *error = nil; 

    if (![self.fetchedResultsController performFetch:&error]) 
    { 
     // Replace this implementation with code to handle the error appropriately. 
     // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 
    return _fetchedResultsController; 
} 

请看看日志数组数英寸它会显示您获得的总记录。 请分享你的结果。好运.. !!

+0

结果是什么? – 2013-03-23 07:25:59

+0

- [NSFetchedResultsController mutableCopyWithZone:]:无法识别的选择器发送到实例。 我得到这个错误。从我修改你的代码。看起来,我在表格中获得了正确数量的条目。 – user2067051 2013-03-23 08:24:46