2015-12-05 8 views
0

Я пытаюсь удалить строку из QSqlQueryModel следующим образом:Как удалить строку из базы данных SQLite с помощью QSqlQueryModel?

void MainWindow::deleteRecord() 
{ 
    int row_index= ui->tableView->currentIndex().row(); 
    model->removeRow(row_index); 
} 

Но это не работает.

Я попытался следующие, а также:

void MainWindow::deleteRecord() 
    { 
     int row_index= ui->tableView->currentIndex().row();  
     if(!db_manager->delete_record(QString::number(row_no))){ 
      ui->appStatus->setText("Error: data deletion ..."); 
     } else{ 
      ui->appStatus->setText("Record deleted ..."); 
     } 
    } 

Где в db_manager, функция delete_recod (QString row_no) является:

bool DatabaseManager::delete_record(QString row_index) 
{ 
    QSqlQuery query; 
    query.prepare("DELETE FROM personal_Info WHERE ref_no = (:ref_no)"); 
    query.bindValue(":ref_no",row_index); 
    if (!query.exec()) 
    { 
     qDebug() << "Error" << query.lastError().text(); 
     return false; 
    } 
    return true; 
} 

Но также не работает. В обеих попытках приложение не сбой и ошибки SQLite.

Что я делаю неправильно и как я могу это исправить?

ответ

1

Первый подход не подходит, потому что QSqlQueryModel не реализует removeRows. Вы не проверяете его возвращаемое значение (плохо! Плохо! Плохо!), Которое равно false, что означает отказ.

И как он может реализовать функцию удаления строк? Ваш SQL-запрос может быть буквально любым, в том числе набором результатов, для которого нет смысла удалять строки.

Вместо рассмотреть вопрос об использовании QSqlTableModel - это или не может относиться к вашему делу, но, учитывая форму вашего DELETE заявления, я бы сказал, что он делает. (QSqlTableModel показывает только контуры одной таблицы/вида).


Второй подход, возможно, уже работает. Тот факт, что обновленный пользовательский интерфейс не отображается, не подразумевает ничего - вы должны проверить фактическое содержимое базы данных, чтобы убедиться, что оператор DELETE действительно работал и что-то удалил.

Теперь обратите внимание, что из базы данных ничего не происходит, говоря о Qt для обновления своих представлений. Вам нужно настроить эту инфраструктуру. Современные базы данных поддерживают триггеры и системы сигнализации (которые завернуты в Qt на QSqlDriver::notification), которые могут быть использованы для этих целей. В других случаях вы вручную запускаете обновление вашей модели SQL, например, вызывая QSqlTableModel::select().

+0

Btw, когда я использую второе решение, строка удаляется из «TableView» и из базы данных SQLite. Но только если я жестко закодировал свой основной ключ. Я не могу получить primary_key при выборе строки. Я получаю только индекс выбранной строки. Точнее, это именно моя проблема. –

+0

Ну, QSqlTableModel не принимает setQuery, и он разбился как ' 'setQuery' является защищенным членом QSqlTableModel'. Я не могу выполнить «select query» или «delete query» и передать их модели! ... Мне нужно передать запрос моей модели, и именно поэтому я начал использовать 'QSqlQueryModel' по той причине, что могу написать свой собственный запрос. К сожалению, теперь я знаю, что это модель только для чтения. !! .. проблема все еще есть. –

+0

** Что вы на самом деле пытаетесь сделать? ** Не то, что вы пытаетесь решить, какова ваша проблема в первую очередь. – peppe