文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Qt怎么操作SQLite数据库

2023-07-05 11:31

关注

今天小编给大家分享一下Qt怎么操作SQLite数据库的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

1、SQLite 介绍

Sqlite 数据库作为 Qt 项目开发中经常使用的一个轻量级的数据库,可以说是兼容性相对比较好的数据库之一(Sqlite就像Qt的亲儿子,如同微软兼容Access数据库一样)。Qt5 以上版本可以直接使用(Qt自带驱动),是一个轻量级的数据库,概况起来具有以下优点:

2、用法

2.1、准备

引入SQL模块

在Qt项目文件(.pro文件)中,加入SQL模块:

QT += sql

引用头文件

在需要使用SQL的类定义中,引用相关头文件。例如:

#include <QSqlDatabase>#include <QSqlError>#include <QSqlQuery>

2.2、使用

建立数据库

QSqlDatabase database; if (QSqlDatabase::contains("qt_sql_default_connection")){    database = QSqlDatabase::database("qt_sql_default_connection");}else{    // 建立和SQlite数据库的连接    database = QSqlDatabase::addDatabase("QSQLITE");    // 设置数据库文件的名字    database.setDatabaseName("MyDataBase.db");}

第一行中,建立了一个 QSqlDatabase 对象,后续的操作要使用这个对象。

if 语句用来检查指定的连接(connection)是否存在。这里指定的连接名称(connection name)是qt_sql_default_connection,这是 Qt 默认连接名称。实际使用时,这个名称可以任意取。如果判断此连接已经存在,那么 QSqlDatabase::contains() 函数返回 true。此时,进入第一个分支,QSqlDatabase::database() 返回这个连接。

如果这个连接不存在,则进入else分支,需要创建连接,并添加数据库。在else分支第一行,addDatabase()的参数QSQLITE是SQLite对应的驱动名,不能改。而且需要注意的是,addDatabase()的第二个参数被省略了,第二个参数的默认参数就是上面提到的Qt默认连接名称 qt_sql_default_connection。如果需要使用自定义的连接名称(如果程序需要处理多个数据库文件的话就会这样),则应该加入第二个参数,例如:

database = QSqlDatabase::addDatabase("QSQLITE", "my_sql_connection);

这个时候,如果在另一个地方需要判断my_sql_connection连接是否存在,就应该使用 if (QSqlDatabase::contains("my_sql_connection"))。

else 分支第二行中,setDatabaseName() 的参数是数据库文件名。如果这个数据库不存在,则会在后续操作时自动创建;如果已经存在,则后续的操作会在已有的数据库上进行。

打开数据库

使用 open() 打开数据库,并判断是否成功。注意,在第一步检查连接是否存在时,如果连接存在,则在返回这个连接的时候,会默认将数据库打开。

if (!database.open()){    qDebug() << "Error: Failed to connect database." << database.lastError();}else{    // do something}

如果打开数据库成功,则进入else分支。对数据库的操作都需要在else分支中进行。

关闭数据库

数据库操作完成后,最好关闭。

database.close();

操作数据库

对数据库进行操作需要用到 QSqlQuery 类,操作前必须定义一个对象。下面举例说明操作方法。

例1:创建表格

创建一个名为student的表格,表格包含三列,第一列是id,第二列是名字,第三列是年龄。

// 用于执行sql语句的对象QSqlQuery sqlQuery;// 构建创建数据库的sql语句字符串QString createSql = QString("CREATE TABLE student (\                          id INT PRIMARY KEY NOT NULL,\                          name TEXT NOT NULL,\                          age INT NOT NULL)");sqlQuery.prepare(createSql);// 执行sql语句if(!sqlQuery.exec()){    qDebug() << "Error: Fail to create table. " << sqlQuery.lastError();}else{     qDebug() << "Table created!";}

第一行定义一个 QSqlQuery 对象。

第二行是一个 QString,其中的内容是 SQLite 语句。对数据库的操作,都是用 SQLite 的语句完成的,把这些指令以 QString 类型,通过 prepare 函数,保存在 QSqlQuery 对象中。也可将指令,以 QString 形式直接写在 exec() 函数的参数中,例如:

sql_query.exec("CREATE TABLE student (ID INT PRIMARY KEY NOT NULL, ...)");

如果 sql_query.exec() 执行成功,则创建表格成功。

例2:插入单行数据

在刚才创建的表格中,插入单行数据。

// 方法一:使用 bindValue 函数插入单行数据QSqlQuery sqlQuery;sqlQuery.prepare("INSERT INTO student VALUES(:id,:name,:age)");sqlQuery.bindValue(":id", max_id + 1);sqlQuery.bindValue(":name", "Wang");sqlQuery.bindValue(":age", 25);if(!sqlQuery.exec()){    qDebug() << "Error: Fail to insert data. " << sqlQuery.lastError();}else{    // do something    } // 方法二:使用 addBindValue 函数插入单行数据QSqlQuery sqlQuery;sqlQuery.prepare("INSERT INTO student VALUES(?, ?, ?)");sqlQuery.addBindValue(max_id + 1);sqlQuery.addBindValue("Wang");sqlQuery.addBindValue(25);if(!sqlQuery.exec()){    qDebug() << "Error: Fail to insert data. " << sqlQuery.lastError();}else{    // do something    } // 方法三:直接写出完整语句if(!sql_query.exec("INSERT INTO student VALUES(3, \"Li\", 23)")){    qDebug() << "Error: Fail to insert data. " << sqlQuery.lastError();}else{    // do something }

例3:查询全部数据

QSqlQuery sqlQuery;sqlQuery.exec("SELECT * FROM student");if(!sqlQuery.exec()){    qDebug() << "Error: Fail to query table. " << sqlQuery.lastError();}else{    while(sqlQuery.next())    {        int id = sqlQuery.value(0).toInt();        QString name = sqlQuery.value(1).toString();        int age = sqlQuery.value(2).toInt();        qDebug()<<QString("id:%1    name:%2    age:%3").arg(id).arg(name).arg(age);    }}

例4:更新数据(修改数据)

QSqlQuery sqlQuery;sqlQuery.prepare("UPDATE student SET name=?,age=? WHERE id=?");sqlQuery.addBindValue(name);sqlQuery.addBindValue(age);sqlQuery.addBindValue(id);if(!sqlQuery.exec()){    qDebug() << sqlQuery.lastError();}else{    qDebug() << "updated data success!";}

3、完整示例程序

上面只是列举了几个常用的SQL语句例子,下面贴出一个完整示例程序:

SqliteOperator.h

#ifndef SQLITEOPERATOR_H#define SQLITEOPERATOR_H #include <QSqlDatabase>#include <QSqlQuery>#include <QSqlError>#include <QDebug> typedef struct{    int id;    QString name;    int age;}w2dba; class SqliteOperator{public:    SqliteOperator();     // 打开数据库    bool openDb(void);    // 创建数据表    void createTable(void);    // 判断数据表是否存在    bool isTableExist(QString& tableName);    // 查询全部数据    void queryTable();    // 插入数据    void singleInsertData(w2dba &singleData); // 插入单条数据    void moreInsertData(QList<w2dba> &moreData); // 插入多条数据    // 修改数据    void modifyData(int id, QString name, int age);    // 删除数据    void deleteData(int id);    //删除数据表    void deleteTable(QString& tableName);    // 关闭数据库    void closeDb(void); private:    QSqlDatabase database;// 用于建立和数据库的连接}; #endif //  SQLITEOPERATOR_H

SqliteOperator.cpp

#include "sqliteoperator.h" // 构造函数中初始化数据库对象,并建立数据库SqliteOperator::SqliteOperator(){    if (QSqlDatabase::contains("qt_sql_default_connection"))    {        database = QSqlDatabase::database("qt_sql_default_connection");    }    else    {        // 建立和SQlite数据库的连接        database = QSqlDatabase::addDatabase("QSQLITE");        // 设置数据库文件的名字        database.setDatabaseName("MyDataBase.db");    }} // 打开数据库bool SqliteOperator::openDb(){    if (!database.open())    {        qDebug() << "Error: Failed to connect database." << database.lastError();    }    else    {        // do something    }     return true;} // 创建数据表void SqliteOperator::createTable(){    // 用于执行sql语句的对象    QSqlQuery sqlQuery;    // 构建创建数据库的sql语句字符串    QString createSql = QString("CREATE TABLE student (\                          id INT PRIMARY KEY NOT NULL,\                          name TEXT NOT NULL,\                          age INT NOT NULL)");    sqlQuery.prepare(createSql);    // 执行sql语句    if(!sqlQuery.exec())    {        qDebug() << "Error: Fail to create table. " << sqlQuery.lastError();    }    else    {        qDebug() << "Table created!";    }} // 判断数据库中某个数据表是否存在bool SqliteOperator::isTableExist(QString& tableName){    QSqlDatabase database = QSqlDatabase::database();    if(database.tables().contains(tableName))    {        return true;    }     return false;} // 查询全部数据void SqliteOperator::queryTable(){    QSqlQuery sqlQuery;    sqlQuery.exec("SELECT * FROM student");    if(!sqlQuery.exec())    {        qDebug() << "Error: Fail to query table. " << sqlQuery.lastError();    }    else    {        while(sqlQuery.next())        {            int id = sqlQuery.value(0).toInt();            QString name = sqlQuery.value(1).toString();            int age = sqlQuery.value(2).toInt();            qDebug()<<QString("id:%1    name:%2    age:%3").arg(id).arg(name).arg(age);        }    }} // 插入单条数据void SqliteOperator::singleInsertData(w2dba &singledb){    QSqlQuery sqlQuery;    sqlQuery.prepare("INSERT INTO student VALUES(:id,:name,:age)");    sqlQuery.bindValue(":id", singledb.id);    sqlQuery.bindValue(":name", singledb.name);    sqlQuery.bindValue(":age", singledb.age);    if(!sqlQuery.exec())    {        qDebug() << "Error: Fail to insert data. " << sqlQuery.lastError();    }    else    {        // do something    }} // 插入多条数据void SqliteOperator::moreInsertData(QList<w2dba>& moredb){    // 进行多个数据的插入时,可以利用绑定进行批处理    QSqlQuery sqlQuery;    sqlQuery.prepare("INSERT INTO student VALUES(?,?,?)");    QVariantList idList,nameList,ageList;    for(int i=0; i< moredb.size(); i++)    {        idList <<  moredb.at(i).id;        nameList << moredb.at(i).name;        ageList << moredb.at(i).age;    }    sqlQuery.addBindValue(idList);    sqlQuery.addBindValue(nameList);    sqlQuery.addBindValue(ageList);     if (!sqlQuery.execBatch()) // 进行批处理,如果出错就输出错误    {        qDebug() << sqlQuery.lastError();    }} // 修改数据void SqliteOperator::modifyData(int id, QString name, int age){    QSqlQuery sqlQuery;    sqlQuery.prepare("UPDATE student SET name=?,age=? WHERE id=?");    sqlQuery.addBindValue(name);    sqlQuery.addBindValue(age);    sqlQuery.addBindValue(id);    if(!sqlQuery.exec())    {        qDebug() << sqlQuery.lastError();    }    else    {        qDebug() << "updated data success!";    }} // 删除数据void SqliteOperator::deleteData(int id){    QSqlQuery sqlQuery;     sqlQuery.exec(QString("DELETE FROM student WHERE id = %1").arg(id));    if(!sqlQuery.exec())    {        qDebug()<<sqlQuery.lastError();    }    else    {        qDebug()<<"deleted data success!";    }} //删除数据表void SqliteOperator::deleteTable(QString& tableName){    QSqlQuery sqlQuery;     sqlQuery.exec(QString("DROP TABLE %1").arg(tableName));    if(sqlQuery.exec())    {        qDebug() << sqlQuery.lastError();    }    else    {        qDebug() << "deleted table success";    }} void SqliteOperator::closeDb(void){    database.close();}

main.cpp

#include <QCoreApplication>#include "sqliteoperator.h"#include <QString> int main(int argc, char *argv[]){    QCoreApplication a(argc, argv);     //创建并打开SQLite数据库    SqliteOperator sqlTest;    sqlTest.openDb();     // 创建数据表    sqlTest.createTable();     // 判断数据表是否存在    QString str1 = QString("student");    qDebug() << "isTabelExist:" <<sqlTest.isTableExist(str1);     // 插入单条数据    w2dba w2dbaTest1 = {1, "zhangSan", 24};    w2dba w2dbaTest2 = {2, "lisi", 28};    sqlTest.singleInsertData(w2dbaTest1);    sqlTest.singleInsertData(w2dbaTest2);     // 插入多条数据    QList<w2dba> list;    w2dba w2dbaTest3 = {3, "liwu", 26};    w2dba w2dbaTest4 = {4, "niuer", 27};    list.append(w2dbaTest3);    list.append(w2dbaTest4);    sqlTest.moreInsertData(list);    // 查询全部数据    sqlTest.queryTable();    qDebug() << endl;     // 修改数据    sqlTest.modifyData(2, "modify", 10);    // 查询全部数据    sqlTest.queryTable();    qDebug() << endl;     // 删除数据    sqlTest.deleteData(2);    // 查询全部数据    sqlTest.queryTable();    qDebug() << endl;     // 删除数据表    QString str2 = QString("student");    sqlTest.deleteTable(str2);     //关闭数据库    sqlTest.closeDb();     return a.exec();}

运行结果如下:

Table created!
isTabelExist: true
"id:1    name:zhangSan    age:24"
"id:2    name:lisi    age:28"
"id:3    name:liwu    age:26"
"id:4    name:niuer    age:27"
 
updated data success!
"id:1    name:zhangSan    age:24"
"id:2    name:modify    age:10"
"id:3    name:liwu    age:26"
"id:4    name:niuer    age:27"
 
deleted data success!
"id:1    name:zhangSan    age:24"
"id:3    name:liwu    age:26"
"id:4    name:niuer    age:27"
 
deleted table success

以上就是“Qt怎么操作SQLite数据库”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯