Error, core data, reason: '*** -[_PFArray objectAtIndex:]: index (2) beyond bounds (2)'

core-data, ios, uitableview

Solution

Here is your problem:

In `numberOfRowsInSection` you add one to the `fetchedResults` array. Presumably, you want to add an additional row in that section. That is fine.

However, in `cellForRowAtIndexPath` you take `indexPath.row` as the index for your `db_document`. Obviously, in the last row it will crash. You have to first check in which row you are and then retrieve your `db_document` only if you need it for that particular row.

Problem

Hi i am almost new in programing. I am faced with an error that I couldn't solve anyway. Even after comparing with anther solutions. I have worked on it for about 3 days. So let me completely describe my problem: 1.this is my implementation code: ``` #import "DocumentTableViewController.h" #import "AddDocumentTableView.h" #import "DB_document.h" @implementation DocumentTableViewController @synthesize managedObjectContext; @synthesize btnAddDocument; @synthesize fetchedObjects; - (id)initWithStyle:(UITableViewStyle)style { self = [super initWithStyle:style]; if (self) { // Custom initialization } return self; } - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } #pragma mark - View lifecycle - (void)viewDidLoad { [super viewDidLoad]; NSManagedObjectContext *context = managedObjectContext; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"DB_document" inManagedObjectContext:context]; [fetchRequest setEntity:entity]; NSError *error; fetchedObjects = [context executeFetchRequest:fetchRequest error:&error]; NSLog(@"%d",[fetchedObjects count]); } - (void)viewDidUnload { [self setBtnAddDocument:nil]; [super viewDidUnload]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; } - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 2; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { int result = 0; if (section == 0) { result = [fetchedObjects count] + 1; } else if (section == 1) { result = 1; } return result; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 40; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } DB_document *db_document = [fetchedObjects objectAtIndex:indexPath.row]; if (indexPath.section == 0 && indexPath.row == 0) { UILabel *lblMoney = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, 70, 40)]; lblMoney.text = @"amount"; lblMoney.textAlignment = UITextAlignmentCenter; lblMoney.textColor = [UIColor blackColor]; lblMoney.backgroundColor = [UIColor clearColor]; lblMoney.font = [UIFont systemFontOfSize:12]; [cell addSubview:lblMoney]; UILabel *lblDescription = [[UILabel alloc] initWithFrame:CGRectMake(85, 0, 150, 40)]; lblDescription.text = @"description"; lblDescription.textAlignment = UITextAlignmentCenter; lblDescription.textColor = [UIColor blackColor]; lblDescription.backgroundColor = [UIColor clearColor]; lblDescription.font = [UIFont systemFontOfSize:12]; [cell addSubview:lblDescription]; UILabel *lblDate = [[UILabel alloc] initWithFrame:CGRectMake(240, 0, 70, 40)]; lblDate.text = @"date"; lblDate.textAlignment = UITextAlignmentCenter; lblDate.textColor = [UIColor blackColor]; lblDate.backgroundColor = [UIColor clearColor]; lblDate.font = [UIFont systemFontOfSize:12]; [cell addSubview:lblDate]; UIButton *btnLine1 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btnLine1.frame = CGRectMake(80, 0, 1, 40); [cell addSubview:btnLine1]; UIButton *btnLine2 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btnLine2.frame = CGRectMake(240, 0, 1, 40); [cell addSubview:btnLine2]; return cell; } if (indexPath.section == 0 && indexPath.row != 0) { UILabel *lblMoney = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, 70, 40)]; lblMoney.text = [NSString stringWithFormat:@"%d",db_document.docAmount]; lblMoney.textAlignment = UITextAlignmentCenter; lblMoney.textColor = [UIColor blackColor]; lblMoney.backgroundColor = [UIColor clearColor]; lblMoney.font = [UIFont systemFontOfSize:12]; [cell addSubview:lblMoney]; UILabel *lblDescription = [[UILabel alloc] initWithFrame:CGRectMake(85, 0, 150, 40)]; lblDescription.text = db_document.docDescription; lblDescription.numberOfLines = 2; lblDescription.textAlignment = UITextAlignmentCenter; lblDescription.textColor = [UIColor blackColor]; lblDescription.backgroundColor = [UIColor clearColor]; lblDescription.font = [UIFont systemFontOfSize:12]; [cell addSubview:lblDescription]; UILabel *lblDate = [[UILabel alloc] initWithFrame:CGRectMake(240, 0, 70, 40)]; NSDateFormatter *dateFormater = [[NSDateFormatter alloc] init]; [dateFormater setDateFormat:@"yyyy/mm/dd"]; lblDate.text = [NSString stringWithFormat:@"%@",[dateFormater stringFromDate:(NSDate *)db_document.docDate]]; lblDate.textAlignment = UITextAlignmentCenter; lblDate.textColor = [UIColor blackColor]; lblDate.backgroundColor = [UIColor clearColor]; lblDate.font = [UIFont systemFontOfSize:12]; [cell addSubview:lblDate]; UIButton *btnLine1 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btnLine1.frame = CGRectMake(80, 0, 1, 40); [cell addSubview:btnLine1]; UIButton *btnLine2 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btnLine2.frame = CGRectMake(240, 0, 1, 40); [cell addSubview:btnLine2]; return cell; } if (indexPath.section == 1) { UILabel *lblMoney = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, 70, 40)]; lblMoney.text = @""; lblMoney.textAlignment = UITextAlignmentCenter; lblMoney.textColor = [UIColor blackColor]; lblMoney.backgroundColor = [UIColor clearColor]; lblMoney.font = [UIFont systemFontOfSize:12]; [cell addSubview:lblMoney]; UILabel *lblTotalAmount = [[UILabel alloc] initWithFrame:CGRectMake(165, 0, 140, 40)]; lblTotalAmount.text = @"amounts"; lblTotalAmount.textAlignment = UITextAlignmentCenter; lblTotalAmount.textColor = [UIColor blackColor]; lblTotalAmount.backgroundColor = [UIColor clearColor]; lblTotalAmount.font = [UIFont systemFontOfSize:12]; [cell addSubview:lblTotalAmount]; UIButton *btnLine = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btnLine.frame = CGRectMake(160, 0, 1, 40); [cell addSubview:btnLine]; return cell; } return cell; } - (IBAction)btnAddDocument_click:(id)sender { AddDocumentTableView *addDocumentTableView = [[AddDocumentTableView alloc] init]; addDocumentTableView.managedObjectContext = managedObjectContext; [self.navigationController pushViewController:addDocumentTableView animated:YES]; } ``` 2.this is the error: 2012-06-16 15:25:31.696 Account5[5534:fb03] 2 2012-06-16 15:25:31.704 Account5[5534:fb03] * Terminating app due to uncaught exception 'NSRangeException', reason: '* -[_PFArray objectAtIndex:]: index (2) beyond bounds (2)' *** First throw call stack: 3.Let me describe the program. I can save data to data base with core data but when i want to fetch the data program jumps out.I have to consider that I think NSManagedObjectContext fetched data because fetchedObjects Array has 2 data because I inserted in. and I have to say that my RootViewController is DocumentTableViewController it means that exactly when I run the program it crashes. And if I want to run the app I must comment `DB_document *db_document = [fetchedObjects objectAtIndex:indexPath.row];` and after that app runs and I can insert data in another page. I have to consider that when the app crashes it stops exactly on `DB_document *db_document = [fetchedObjects objectAtIndex:indexPath.row];` with green highlighted line. thank you

Original source