Search code examples
objective-cxcodeuitableviewfmdbdelete-row

delete from tableview with sqlite3 statement


I am trying to delete a row in a UITableView which is populated from a SQL database.

The sql statement I am using is from a class called databaseHanderClass. The method takes an integer which is the id to delete a row in the database - the primary key.

-(BOOL) deleteFromDatabase: (NSInteger)delete_id
{
   FMDatabase *dbHandler = [FMDatabase databaseWithPath: [Utility getDatabasePath]];
   BOOL success;
   @try 
   {
        [dbHandler open];        
        success = [dbHandler executeUpdate:@"DELETE FROM inputs WHERE id=%d", delete_id];
        [dbHandler close];
   }
   @catch (NSException *exception) 
   {
       NSLog(@"fejl...%@", exception);
   }
   @finally 
   {
       return success;
   }
}

The method I am using for deletion in the UITableView is the following.

- (void)tableView:(UITableView *)tableView commitEditingStyle (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    {
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];            

    }   
    else if (editingStyle == UITableViewCellEditingStyleInsert) 
    {
         //statement
    }   
}

Solution

  • You need to implement the following methods: THIS SHOULD WORK

    For your database code, try:

    -(BOOL) deleteFromDatabase: (NSInteger)delete_id
    {
        FMDatabase *dbHandler = [FMDatabase databaseWithPath: [Utility getDatabasePath]];
        BOOL success = NO;
    
        if(![dbHandler open])
        {
            NSLog(@"Could not open DB");
            return NO; 
        }
    
        [dbHandler beginTransaction];
        success = [dbHandler executeUpdate:@"DELETE FROM inputs WHERE id = ?", 
        [NSNumber numberWithInt:delete_id]];
    
        [dbHandler commit]; 
        [dbHandler close];
        return success;
    }
    

    For "commitEditingStyle" method, try the following:

    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
    {
          if (editingStyle == UITableViewCellEditingStyleDelete) {
          NSInteger row_number_to_be_deleted = indexPath.row;
          //call method to delete from database
          [DatabaseHandler deleteFromDatabase:row_number_to_be_deleted];
    
          //now, fetch all details from Database
          self.dataSource = [DatabaseHandler getAllData];
          [tableView reloadData];
    }
    

    For "NumberOfRowsInSection":

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [self.dataSource count];
    }
    

    For "canEditRowAtIndexPath":

    -(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return YES;
    }
    

    For "editingStyleForRowAtIndexPath":

    - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView
           editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSLog(@"Editing Style-DELETE %i", [indexPath row]);
        return UITableViewCellEditingStyleDelete;
    }
    

    For "commitEditingStyle":

     - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
     {
    
         if (editingStyle == UITableViewCellEditingStyleDelete) 
         {
             // Do whatever data deletion you need to do...
             // Delete the row from the data source
             /* This HAS to be changed by YOU */ 
             Employee* emp = [self.dataSource objectAtIndex:[indexPath row]]; 
             NSLog(@"Delete row %i", [indexPath row]);
             [DataEngine removeData:emp];
             [self.dataSource removeObjectAtIndex:[indexPath row]];
         } 
         [self.tableView reloadData];
    }