title: How to delete a row from UITableView
body: <p>I'm trying to delete a row from my table view and so far have been unsuccessful. I keep getting this error:</p>
  
  <blockquote>
    <p>"Terminating app due to uncaught exception
    'NSInternalInconsistencyException', reason: 'Invalid update: invalid
    number of rows in section 0.  The number of rows contained in an
    existing section after the update (5) must be equal to the number of
    rows contained in that section before the update (5), plus or minus
    the number of rows inserted or deleted from that section (0 inserted,
    1 deleted).'" The array which i use to populate the table view is
    declared in that class, also i get my objects for my array from an
    sqlite db.</p>
  </blockquote>
  
  <p>The code that i used to try deleting rows is as follows.</p>
  
  <pre><code>- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
  
  if (editingStyle == UITableViewCellEditingStyleDelete) {
      // Delete the row from the data source
  
      [categoryArray objectAtIndex:indexPath.row];
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
  
  }   
  else if (editingStyle == UITableViewCellEditingStyleInsert) {
      // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
  }   
  }
  </code></pre>
  
  <p>Now for the questions i hope to get answered:</p>
  
  <p>-How can i delete rows properly?</p>
  
  <p>-Will i face deleting the row if its the only one left in the tableView?</p>
  
  <p>-Can i change the tableView that is used in the method to be the UITableView i declared in 
  my .h file?</p>
  
  <p>Many Thanks.</p>
  
  <hr>
  
  <p>Edit</p>
  
  <p>-Full .m code</p>
  
  <pre><code>#import "DeleteCategoryTableView.h"
  #import "KeyCryptAppAppDelegate.h"
  
  
  @implementation DeleteCategoryTableView
  @synthesize categoryArray;
  
  #pragma mark -
  #pragma mark Initialization
  
  -(void) initializeCategoryArray {
  
  sqlite3 *db= [KeyCryptAppAppDelegate getNewDBConnection];
  KeyCryptAppAppDelegate *appDelegate = (KeyCryptAppAppDelegate *)[[UIApplication sharedApplication] delegate];
  
  const char *sql = [[NSString stringWithFormat:(@"Select Category from Categories;")]cString];
  
  
  sqlite3_stmt *compiledStatement;
  
  
  
  if (sqlite3_prepare_v2(db, sql, -1, &amp;compiledStatement, NULL)==SQLITE_OK)
  {
      while(sqlite3_step(compiledStatement) == SQLITE_ROW)
          [categoryArray addObject:[NSString stringWithUTF8String:(char*) sqlite3_column_text(compiledStatement, 0)]];
  
  }
  else {
      NSAssert1(0,@"Error preparing statement", sqlite3_errmsg(db));
  }
  sqlite3_finalize(compiledStatement);
  }
  /*
  - (id)initWithStyle:(UITableViewStyle)style {
  // Override initWithStyle: if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
  if ((self = [super initWithStyle:style])) {
  }
  return self;
  }
  */
  #pragma mark -
  #pragma mark View lifecycle
  - (void)viewDidLoad {
  self.title = NSLocalizedString(@"Delete Categories",@"Delete your Categories");
  categoryArray = [[NSMutableArray alloc]init];
  [self initializeCategoryArray];
  [super viewDidLoad];
  
  // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
  self.navigationItem.rightBarButtonItem = self.editButtonItem;
  }
  /*
  - (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];
  }
  */
  /*
  // Override to allow orientations other than the default portrait orientation.
  - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  // Return YES for supported orientations
  return (interfaceOrientation == UIInterfaceOrientationPortrait);
  }
  */
  
  
  #pragma mark -
  #pragma mark Table view data source
  
  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  // Return the number of sections.
  return 1;
  }
  
  
  - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section    {
  // Return the number of rows in the section.
  return [self.categoryArray count];
  }
  
  
  // Customize the appearance of table view cells.
  - (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] autorelease];
  }
  
  // Configure the cell...
  NSUInteger row = [indexPath row];
  cell.text = [categoryArray objectAtIndex:row];
  return cell;
  }
  /*
  // Override to support conditional editing of the table view.
  - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
  // Return NO if you do not want the specified item to be editable.
  return YES;
  }
  */
  // Override to support editing the table view.
  - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
  
  if (editingStyle == UITableViewCellEditingStyleDelete) {
      // Delete the row from the data source
  
      [categoryArray removeObjectAtIndex:indexPath.row];
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
      [deleteCategoryTable reloadData];
  
      NSString *selectedCategory = [categoryArray objectAtIndex:indexPath.row];
  
      sqlite3 *db= [KeyCryptAppAppDelegate getNewDBConnection];
      KeyCryptAppAppDelegate *appDelegate = (KeyCryptAppAppDelegate *)[[UIApplication sharedApplication] delegate];
      const char *sql = [[NSString stringWithFormat:@"Delete from Categories where Category = '%@';", selectedCategory]cString];
  
      sqlite3_stmt *compiledStatement;
  
  
      if (sqlite3_prepare_v2(db, sql, -1, &amp;compiledStatement, NULL)==SQLITE_OK)
      {
          sqlite3_exec(db,sql,NULL,NULL,NULL);
  
      }
      else {
          NSAssert1(0,@"Error preparing statement", sqlite3_errmsg(db));
      }
      sqlite3_finalize(compiledStatement);
  }
  
  
  
  else if (editingStyle == UITableViewCellEditingStyleInsert) {
      // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
  }   
  }
  /*
  // Override to support rearranging the table view.
  - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
  }
  */
  /*
  // Override to support conditional rearranging of the table view.
  - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
  // Return NO if you do not want the item to be re-orderable.
  return YES;
  }
  */
  #pragma mark -
  #pragma mark Table view delegate
  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  // Navigation logic may go here. Create and push another view controller.
  /*
   &lt;#DetailViewController#&gt; *detailViewController = [[&lt;#DetailViewController#&gt; alloc] initWithNibName:@"&lt;#Nib name#&gt;" bundle:nil];
   // ...
   // Pass the selected object to the new view controller.
   [self.navigationController pushViewController:detailViewController animated:YES];
   [detailViewController release];
   */
  }
  #pragma mark -
  #pragma mark Memory management
  
  - (void)didReceiveMemoryWarning {
  // Releases the view if it doesn't have a superview.
  [super didReceiveMemoryWarning];
  
  // Relinquish ownership any cached data, images, etc that aren't in use.
  }
  
  - (void)viewDidUnload {
  // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
  // For example: self.myOutlet = nil;
  }
  
  
  - (void)dealloc {
  [super dealloc];
  }
  
  
  @end
  </code></pre>