2013-08-14 7 views
0

Я загрузил некоторые данные в своем табличном представлении с использованием базы данных SQLite в формате 1) некоторое значение, 2) некоторое значение и так далее. 1 и 2 являются первичным ключом, это мой код для удаления, который я поставил на прикосновении на функции удаления представления таблицыДанные, которые не удаляются из базы данных с помощью SQLite

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [self openDB]; 
    NSString *idofTable = [NSString new]; 
    NSScanner *scanner = [[NSScanner alloc] initWithString:[self.tableLogView cellForRowAtIndexPath:indexPath].textLabel.text]; 
    [scanner scanUpToString:@")" intoString:&idofTable]; 

    NSLog(@"id=%@, text=%@", idofTable, [self.tableLogView cellForRowAtIndexPath:indexPath].textLabel.text); 

    if(editingStyle==UITableViewCellEditingStyleDelete) 
    { 
     char *error; 

     NSString *sql = [NSString stringWithFormat:@"DELETE FROM History WHERE 'id' = '%@'", idofTable]; 

     NSLog(@"%@",sql); 

     if(sqlite3_exec(db, [sql UTF8String], NULL, NULL,&error)!=SQLITE_OK) 
     { 
      sqlite3_close(db); 
      NSAssert(0,@"Could not create table"); 

     } 
     else 
     { 
      NSLog(@"Data Deleted"); 
      sqlite3_exec(db, "COMMIT", NULL, NULL, &error); 
     } 
    } 
    [tableLogView reloadData]; 
} 

Журнал «Data Deleted» печатается, но данные не получает удалены в базе данных ни в таблице. Любая помощь оценивается. Я не знаю, где происходит ошибка, запрос кажется правильным.

+0

Пожалуйста, разместите здесь журнал статусов sql. Правильно ли ID? –

+0

Как вы можете сказать, что данные не удалены, перезагрузив таблицу? вы уверены, что значения для tableview были обновлены? – NAZIK

+0

, вы также должны удалить запись из массива данных таблицы, чтобы обновить представление таблицы. – iNeal

ответ

1

Try This

if(editingStyle==UITableViewCellEditingStyleDelete) 
     { 
      NSString *dbFilePath =[DBclass getDBPath]; 

      sqlite3_stmt *deleteStmt = nil; 
     if(sqlite3_open([dbFilePath UTF8String], &database)==SQLITE_OK) 
     { 

     NSString *deleteString=[NSString stringWithFormat:@"delete from table where ID =%d",idValue]; 
     const char *sql =[deleteString UTF8String]; 

     if(sqlite3_prepare_v2(database, sql, -1, &deleteStmt, NULL) != SQLITE_OK) 
      NSAssert1(0, @"Error while creating delete view statement. '%s'", sqlite3_errmsg(database)); 

     if(SQLITE_DONE != sqlite3_step(deleteStmt)) 
      NSAssert1(0, @"Error while deleting data. '%s'", sqlite3_errmsg(database)); 
     else 
      NSLog(@"Success in deleting the medicine."); 

     sqlite3_close(database); 
    } 
     } 
     [tableLogView reloadData]; 
+0

На код неправильный, он даже не дорабатывает и не закрывает базу данных;) – null

+0

Спасибо, на самом деле мой код теперь работает, когда я удалял цитаты из «id», благодаря вашему коду, который помог мне разобраться в ошибка. Значение из базы данных теперь удаляется, но оно не обновляет представление таблицы даже при вызове reloadData. Есть идеи?? – Gamerlegend

+0

Да, вы делаете еще одну вещь после удаления из базы данных, вы удаляете значение из индекса массива, прежде чем перезагружать данные, подобные этому [yourArray removeObjectAtIndex: indexPath.row]; [table reloadData]; –

0

Это правильный способ удалить строку:

if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) { 

    NSString *sql = [NSString stringWithFormat:@"DELETE FROM History WHERE 'id' = '%@'", idofTable]; 

    const char *del_stmt = [sql UTF8String]; 
    sqlite3_prepare_v2(contactDB, del_stmt, -1, & deleteStmt, NULL); 
    if (sqlite3_step(deleteStmt) == SQLITE_DONE) 
    { 
     NSLog(@"Data Deleted"); 
     sqlite3_exec(db, "COMMIT", NULL, NULL, &error); 
    }else { 
     NSLog(@"Error: %s", sqlite3_errmsg(database)); 
    } 
    sqlite3_finalize(deleteStmt); 
    sqlite3_close(contactDB); 


} 
1

Вы Арент завершения, ни закрытия базы данных.

sqlite3_finalize(stmt); 

sqlite3_close(DB);