无法更新QSqlite数据库-数据库已锁定无法获取行

无法更新QSqlite数据库-数据库已锁定无法获取行,sqlite,qt4,Sqlite,Qt4,我正在写一份联系簿申请书。联系人存储在qsqlite数据库中,并使用QSqlQueryModel显示 默认情况下,QueryModel运行一个显示所有联系人的查询。可以编辑和删除联系人 当用户在搜索字段中输入姓名时,将运行搜索查询,并且仅显示与搜索词匹配的联系人。问题是我无法编辑或删除这些联系人。我得到一个错误,说数据库被锁定,无法获取行 我不明白为什么会这样。如果我可以编辑/删除默认查询的结果,那么我应该能够编辑/删除搜索查询的结果 以下是代码: 建造师 搜索联系人 解除接触 建造商(相关

我正在写一份联系簿申请书。联系人存储在qsqlite数据库中,并使用QSqlQueryModel显示

默认情况下,QueryModel运行一个显示所有联系人的查询。可以编辑和删除联系人

当用户在搜索字段中输入姓名时,将运行搜索查询,并且仅显示与搜索词匹配的联系人。问题是我无法编辑或删除这些联系人。我得到一个错误,说数据库被锁定,无法获取行

我不明白为什么会这样。如果我可以编辑/删除默认查询的结果,那么我应该能够编辑/删除搜索查询的结果

以下是代码:

  • 建造师

  • 搜索联系人

  • 解除接触

建造商(相关部分)

搜索联系人

void Contacts::SearchContact()
{
    /*1. Read Search Term
      2. Decide Type
      3. Generate Query
      4. Execute Query.
      5. If No results, return
      6. If resutls, update Model, show first result.
      */

    //STEP 1: Read Search Term.
    QString SearchTerm = ui->SearchLineEdit->text();

    if(SearchTerm.isEmpty())
        return;

    /*STEP 2. Decide Type
      Type n : Name
      Type e : Email
      Type p : Number
      */
    char QueryType;

    if(SearchTerm.contains(QRegExp("[A-za-z-]+")))
    {
        if(SearchTerm.contains("@"))
            QueryType = 'e';
        else
            QueryType = 'n';
    }else if(SearchTerm.contains(QRegExp("[0-9]+")))
        QueryType = 'p';
    else
        QueryType = 'n';


    //STEP 3: Generate Query
    QSqlQuery SearchQuery;

    switch(QueryType)
    {
    case 'n':
    {
        QStringList Names = SearchTerm.split(" ");
        if(Names.size()>=2)
        {
            qDebug()<<QString("Searching for %1 %2").arg(Names.first(),Names.last());
            SearchQuery.prepare("SELECT Id,FirstName||' '||LastName AS FullName,FirstName,LastName,Email,HomeNumber,MobileNumber,WorkNumber,Address,City,Country,Birthdate FROM CONTACTS WHERE FirstName=:f AND LastName=:l ORDER BY FirstName");
            SearchQuery.bindValue(":f",Names.first());
            SearchQuery.bindValue(":l",Names.last());
        }else
        {
            qDebug()<<QString("Searching for %1").arg(Names.first());
            SearchQuery.prepare("SELECT Id,FirstName||' '||LastName AS FullName,FirstName,LastName,Email,HomeNumber,MobileNumber,WorkNumber,Address,City,Country,Birthdate FROM CONTACTS WHERE FirstName=:f OR LastName=:l ORDER BY FirstName");
            SearchQuery.bindValue(":f",Names.first());
            SearchQuery.bindValue(":l",Names.first());
        }
        break;
    }

    case 'e':
    {
        QString Email = SearchTerm.trimmed();
        SearchQuery.prepare("SELECT Id,FirstName||' '||LastName AS FullName,FirstName,LastName,Email,HomeNumber,MobileNumber,WorkNumber,Address,City,Country,Birthdate FROM CONTACTS WHERE Email=:e ORDER BY FirstName");
        SearchQuery.bindValue(":e",Email);
        break;
    }

    case 'p':
    {
        QString Number = SearchTerm.trimmed();
        SearchQuery.prepare("SELECT Id,FirstName||' '||LastName AS FullName,FirstName,LastName,Email,HomeNumber,MobileNumber,WorkNumber,Address,City,Country,Birthdate FROM CONTACTS WHERE HomeNumber=:h OR WorkNumber=:w OR MobileNumber=:m ORDER BY FirstName");
        SearchQuery.bindValue(":h",Number);
        SearchQuery.bindValue(":m",Number);
        SearchQuery.bindValue(":w",Number);
        break;
    }
    }

    //STEP 4: Execute Query
    if(!SearchQuery.exec())
    {
        qDebug()<<QueryType<<": "<<SearchQuery.lastError().text();
        QMessageBox::information(this,
                                 tr("Search Error"),
                                 tr("The following error occured while trying to search contacts:\nError: %1").arg(SearchQuery.lastError().text()));
        return;
    }

    //STEP 5: If no results, return;

    /*Note:
    I used the QSqlQuery::first() method here to check if there are any result or not.
    I doubt this is efficient, because the function probably invovles unnecessary steps & resources.
    So the following code could be made more efficient.

    I can't use QSqlQuery::size() because it always returns -1.
      */

    if(!SearchQuery.first())
    {
        QMessageBox::information(this,
                                 tr("No Results Found"),
                                 tr("No results were found for \"%1\"").arg(SearchTerm));
        return;
    }

    //STEP 6: If results, update model, show first result.
    Model->setQuery(SearchQuery);

    QModelIndex index = Model->index(0,1);
    DisplayContact(index);
    ui->listView->scrollTo(index);

    SetView(Contacts::View_DisplaySearchResultsView);
}
void Contacts::RemoveContact()
{
    if(SelectedRecordId!=-1)
    {
        if(QMessageBox::information(this,
                                 "Confirm Removal",
                                 "Are you sure you want to remove this contact from your list?",
                                 QMessageBox::Yes|QMessageBox::No)==QMessageBox::No)
            return;

        QSqlQuery DeleteQuery;
        DeleteQuery.prepare("DELETE FROM Contacts WHERE Id = :i;");
        DeleteQuery.bindValue(":i",SelectedRecordId);


        if(!DeleteQuery.exec())
        {
            qDebug()<<DeleteQuery.lastError().text();
            QMessageBox::warning(this,
                                 tr("Error Removing Contact"),
                                 tr("An error occured while trying to remove this contact."));
        }else
        {
            SelectedRecordId =-1;

            clear();
            SetView(Contacts::View_AddContactView);
            Model->setQuery(ActiveQuery);
            UpdateContactCount();
        }
    }else
        QMessageBox::warning(this,
                              tr("No Record Selected"),
                              tr("Unexpected Error: Remove Contact Operation is being attempted while no contact is selected."));
}
void Contacts::SearchContact()
{
/*1.阅读搜索词
2.决定类型
3.生成查询
4.执行查询。
5.如果没有结果,请返回
6.如果恢复,更新模型,显示第一个结果。
*/
//步骤1:阅读搜索词。
QString SearchTerm=ui->SearchLineEdit->text();
if(SearchTerm.isEmpty())
返回;
/*步骤2.决定类型
类型n:名称
e类:电子邮件
类型p:编号
*/
字符查询类型;
if(SearchTerm.contains(QRegExp(“[A-za-z-]+”)))
{
if(SearchTerm.contains(“@”))
QueryType='e';
其他的
QueryType='n';
}else if(SearchTerm.contains(QRegExp(“[0-9]+”)))
QueryType='p';
其他的
QueryType='n';
//步骤3:生成查询
QSqlQuery搜索查询;
开关(查询类型)
{
案例“n”:
{
QStringList Names=SearchTerm.split(“”);
如果(Names.size()>=2)
{

qDebug()唯一想到的是需要确保查询的所有结果都已获取。打开的查询可能会保持数据库锁定。可能

因此,步骤6的开头如下所示:

//STEP 6: If results, update model, show first result.
Model->setQuery(SearchQuery);
while (Model->canFetchMore()) {
   Model->fetchMore();
}

我想尝试一下也没什么坏处。

奇怪的是,删除这行代码后,代码运行良好:

 ui->listView->scrollTo(index);

保留这一行并添加
fetchMore()
会有帮助吗?我真的很想弄清楚为什么它不起作用。
scrollTo
行可能只暴露了一个问题——我认为它的删除文件涉及到了潜在的问题。你应该能够毫无问题地进行滚动。
 ui->listView->scrollTo(index);