今天在写一段如下测试代码的时候,在多次执行代码之后,会出现一个问题:

bool MainWindow::createDatabase(const QString &dbName)
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(dbName);

    if (!db.open())
    {
        ui->textEdit->append(db.lastError().text());
        return false;
    }
	ui->textEdit->append("数据库打开成功");

    QSqlQuery query(db);
    if (!query.exec("CREATE TABLE dbst(id INTEGER PRIMARY KEY AUTOINCREMENT,\
                     name VARCHAR(256) NOT NULL\
                     )"))
    {
        ui->textEdit->append(query.lastError().text());
        return false;
    }
    ui->textEdit->append("创建表格成功");

    if (!query.exec("INSERT INTO dbst(name) VALUES('XiaoMing')"))
    {
        ui->textEdit->append(query.lastError().text());
        return false;
    }
    ui->textEdit->append("添加'xiaoming'成功");

    if (!query.exec("INSERT INTO dbst(name) VALUES('Xiao Hong')"))
    {
        ui->textEdit->append(query.lastError().text());
        return false;
    }
    ui->textEdit->append("添加'xiao hong'成功");

    if (!query.exec("SELECT * FROM dbst"))
    {
        ui->textEdit->append(query.lastError().text());
        return false;
    }
    ui->textEdit->append("查询成功,结果如下:");
    while (query.next())
    {
        ui->textEdit->append(QString::number(query.value(0).toInt()) + "'name:" + query.value("name").toString());
    }

    return true;
}

错误如下:
在这里插入图片描述
显示该数据库已经存在,无法执行再创建的操作

鉴于此,因为采用的是sqlite数据库,所以可以使用——SELECT COUNT(*) FROM sqlite_master WHERE type=‘table’ AND name=‘dbst’——语句判断该表是否存在,代码如下:

    if (query.exec("SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='dbst'"))
    {
        if (query.next())
        {
            int iCount = query.value(0).toInt();
            if (iCount == 0)
            {
                if (!query.exec("CREATE TABLE dbst(id INTEGER PRIMARY KEY AUTOINCREMENT,\
                                 name VARCHAR(256) NOT NULL\
                                 )"))
                {
                    ui->textEdit->append(query.lastError().text());
                    return false;
                }

                ui->textEdit->append("创建表格成功");
            }
            else
            {
                ui->textEdit->append("dbst is exist.");
            }
        }
    }
    else
    {
    	ui->textEdit->append(query.lastError().text());
    	return false;
    }

现在就可以正常执行了:
在这里插入图片描述
原因:每一个sqlite数据库中都自带一个sqlite_master的表格,它定义数据库的模式,sqlite_master的表结构如下:

CREATE TABLE sqlite_master (
type TEXT,
name TEXT,
tbl_name TEXT,
rootpage INTEGER,
sql TEXT
);

参考链接

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐