• 在Qt中使用SQLite数据库


    前言

    SQLite(sql)是一款开源轻量级的数据库软件,不需要server,可以集成在其他软件中,非常适合嵌入式系统。
    Qt5以上版本可以直接使用SQLite(Qt自带驱动)。

    用法

    1 准备

    1. 引入SQL模块
      在Qt项目文件(.pro文件)中,加入SQL模块:
    QT += sql
    1. 引用头文件
      在需要使用SQL的类定义中,引用相关头文件。例如:
    1. #include
    2. #include
    3. #include

    2 使用

    1. 建立数据库

    检查连接、添加数据库驱动、设置数据库名称、数据库登录用户名、密码。

    1. QSqlDatabase database;
    2. if (QSqlDatabase::contains("qt_sql_default_connection"))
    3. {
    4. database = QSqlDatabase::database("qt_sql_default_connection");
    5. }
    6. else
    7. {
    8. database = QSqlDatabase::addDatabase("QSQLITE");
    9. database.setDatabaseName("MyDataBase.db");
    10. database.setUserName("XingYeZhiXia");
    11. database.setPassword("123456");
    12. }

    上述代码解释:
    (1)第一行中,建立了一个QSqlDatabase对象,后续的操作要使用这个对象。

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

    本文福利, 免费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT图像,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

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

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

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

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

    (5)else分支后面两行,设置用户名和密码。用户名,密码都可以随便取,也可以省略。

    2. 打开数据库

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

    1. if (!database.open())
    2. {
    3. qDebug() << "Error: Failed to connect database." << database.lastError();
    4. }
    5. else
    6. {
    7. // do something
    8. }

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

    3. 关闭数据库

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

        database.close();
    

    4. 操作数据库

    对数据库进行操作需要用到QSqlQuery类,操作前必须定义一个对象。下面举例说明操作方法。操作需要使用SQLite语句,本文中的几个例子会使用几个常用的语句,关于SQLite语句的具体信息请参考SQLite相关资料。

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

    1. QSqlQuery sql_query;
    2. QString create_sql = "create table student (id int primary key, name varchar(30), age int)";
    3. sql_query.prepare(create_sql);
    4. if(!sql_query.exec())
    5. {
    6. qDebug() << "Error: Fail to create table." << sql_query.lastError();
    7. }
    8. else
    9. {
    10. qDebug() << "Table created!";
    11. }

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

        sql_query.exec("create table student (id int primary key, name varchar(30), age int)");
    

    创建表格语句:create table (f1 type1, f2 type2,…);
    create table是创建表格的语句,也可用大写CREATE TABLE;student是表格的名称,可以任意取;括号中是表格的格式,上述指令表明,表格中有三列,第一列的名称(表头)是id,这一列储存的数据类型是int,第二列名称是name,数据类型是字符数组,最多有30个字符(和char(30)的区别在于,varchar的实际长度是变化的,而char的长度始终是给定的值),第三列的名称是age,数据类型是int。
    如果sql_query.exec()执行成功,则创建表格成功。

    例2:插入数据
    在刚才创建的表格中,插入一行数据。

    1. QString insert_sql = "insert into student values (?, ?, ?)";
    2. sql_query.prepare(insert_sql);
    3. sql_query.addBindValue(max_id+1);
    4. sql_query.addBindValue("Wang");
    5. sql_query.addBindValue(25);
    6. if(!sql_query.exec())
    7. {
    8. qDebug() << sql_query.lastError();
    9. }
    10. else
    11. {
    12. qDebug() << "inserted Wang!";
    13. }
    14. if(!sql_query.exec("INSERT INTO student VALUES(3, \"Li\", 23)"))
    15. {
    16. qDebug() << sql_query.lastError();
    17. }
    18. else
    19. {
    20. qDebug() << "inserted Li!";
    21. }

    插入语句:insert into values (value1, value2,…);
    insert into是插入语句,student是表格名称,values()是要插入的数据。这里,我们插入了2组数据。插入第一组数据的时候,用addBindValue来替代语句中的?,替代的顺序与addBindValue调用的顺序相同。插入第二组数据的时候,则是直接写出完整语句。

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

    1. QString update_sql = "update student set name = :name where id = :id";
    2. sql_query.prepare(update_sql);
    3. sql_query.bindValue(":name", "Qt");
    4. sql_query.bindValue(":id", 1);
    5. if(!sql_query.exec())
    6. {
    7. qDebug() << sql_query.lastError();
    8. }
    9. else
    10. {
    11. qDebug() << "updated!";
    12. }

    语句:update set , … where ;
    更新(修改)的语句是update...set...,其中student是表格名称,name是表头名称(即第二列),:name是待定的变量,where用于确定是哪一组数据,:id也是待定变量。
    bindValue(" ", " ")函数用来把语句中的待定变量换成确定值。

    例4:查询数据
    (1)查询部分数据

    1. QString select_sql = "select id, name from student";
    2. if(!sql_query.exec(select_sql))
    3. {
    4. qDebug()<<sql_query.lastError();
    5. }
    6. else
    7. {
    8. while(sql_query.next())
    9. {
    10. int id = sql_query.value(0).toInt();
    11. QString name = sql_query.value(1).toString();
    12. qDebug()<<QString("id:%1 name:%2").arg(id).arg(name);
    13. }
    14. }

    语句select , , ... from ;
    select是查询指令; 等等是要查询的变量(即表头),中间用逗号隔开;from ...指定表格。
    上述语句是说查询student表中的 id 和 name 。执行查询之后,用sql_query.value(int)来获得数据。同样地,value(0)表示第一个数据,即 id,value(1)表示name。注意:value()函数的返回值类型是QVariant,因此要用toInt()等函数转换成特定的类型。

    (2)查询全部数据

    1. QString select_all_sql = "select * from student";
    2. sql_query.prepare(select_all_sql);
    3. if(!sql_query.exec())
    4. {
    5. qDebug()<<sql_query.lastError();
    6. }
    7. else
    8. {
    9. while(sql_query.next())
    10. {
    11. int id = sql_query.value(0).toInt();
    12. QString name = sql_query.value(1).toString();
    13. int age = sql_query.value(2).toInt();
    14. qDebug()<<QString("id:%1 name:%2 age:%3").arg(id).arg(name).arg(age);
    15. }
    16. }

    语句select * from ;
    查询所有数据用 * 表示。用while(sql_query.next())用来遍历所有行。同样用value()获得数据。
    (3)查询最大id

    1. QString select_max_sql = "select max(id) from student";
    2. int max_id = 0;
    3. sql_query.prepare(select_max_sql);
    4. if(!sql_query.exec())
    5. {
    6. qDebug() << sql_query.lastError();
    7. }
    8. else
    9. {
    10. while(sql_query.next())
    11. {
    12. max_id = sql_query.value(0).toInt();
    13. qDebug() << QString("max id:%1").arg(max_id);
    14. }
    15. }

    这个就是在语句中用max来获取最大值。

    例5:删除与清空
    (1)删除一条数据

    1. QString delete_sql = "delete from student where id = ?";
    2. sql_query.prepare(delete_sql);
    3. sql_query.addBindValue(0);
    4. if(!sql_query.exec())
    5. {
    6. qDebug()<<sql_query.lastError();
    7. }
    8. else
    9. {
    10. qDebug()<<"deleted!";
    11. }

    语句delete from where =
    delete用于删除条目,用where给出限定条件。例如此处是删除 id = 0的条目。
    (2)清空表格(删除所有)

    1. QString clear_sql = "delete from student";
    2. sql_query.prepare(clear_sql);
    3. if(!sql_query.exec())
    4. {
    5. qDebug() << sql_query.lastError();
    6. }
    7. else
    8. {
    9. qDebug() << "table cleared";
    10. }

    这里没有用where给出限制,就会删除所有内容。

    本文福利, 免费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT图像,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

  • 相关阅读:
    day1:Node.js 简介
    Java封装
    AP5126 降压恒流 PIN对PIN替LN2566 LED汽车大灯车灯驱动芯片
    python学习笔记(3)—— 数据结构
    Linux nl 命令使用介绍
    浅谈用匈牙利算法寻找二分图的最大匹配
    SpringMVC项目请求(JSON数据传输参数)
    Golang和Java对比
    库存管理方法有哪些?
    Linux下安装Foldseek并从蛋白质的PDB结构中获取 3Di Token 和 3Di Embedding
  • 原文地址:https://blog.csdn.net/m0_60259116/article/details/127654553