Qt怎么操作SQLite数据库

数据库   发布日期:2023年08月17日   浏览次数:491

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

1、SQLite 介绍

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

  • SQLite 的设计目的是嵌入式 SQL 数据库引擎,它基于纯C语言代码,已经应用于非常广泛的领域内。

  • SQLite 在需要长时间存储时可以直接读取硬盘上的数据文件(.db),在无须长时间存储时也可以将整个数据库置于内存中,两者均不需要额外的服务器端进程,即 SQLite 是无须独立运行的数据库引擎。

  • 源代码开源,你可以用于任何用途,包括出售它。

  • 零配置 – 无需安装和管理配置。

  • 不需要配置,不需要安装,也不需要管理员。

  • 同一个数据文件可以在不同机器上使用,可以在不同字节序的机器间自由共享。

  • 支持多种开发语言,C, C++, PHP, Perl, Java, C#,Python, Ruby等。

2、用法

2.1、准备

1、引入SQL模块

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

  1. QT += sql

2、引用头文件

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

  1. #include <QSqlDatabase>
  2. #include <QSqlError>
  3. #include <QSqlQuery>

2.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. // 建立和SQlite数据库的连接
  9. database = QSqlDatabase::addDatabase("QSQLITE");
  10. // 设置数据库文件的名字
  11. database.setDatabaseName("MyDataBase.db");
  12. }

第一行中,建立了一个 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() 的参数是数据库文件名。如果这个数据库不存在,则会在后续操作时自动创建;如果已经存在,则后续的操作会在已有的数据库上进行。

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、关闭数据库

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

  1. database.close();

4、操作数据库

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

例1:创建表格

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

  1. // 用于执行sql语句的对象
  2. QSqlQuery sqlQuery;
  3. // 构建创建数据库的sql语句字符串
  4. QString createSql = QString("CREATE TABLE student (
  5. id INT PRIMARY KEY NOT NULL,
  6. name TEXT NOT NULL,
  7. age INT NOT NULL)");
  8. sqlQuery.prepare(createSql);
  9. // 执行sql语句
  10. if(!sqlQuery.exec())
  11. {
  12. qDebug() << "Error: Fail to create table. " << sqlQuery.lastError();
  13. }
  14. else
  15. { qDebug() << "Table created!";
  16. }

第一行定义一个 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:插入单行数据

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

  1. // 方法一:使用 bindValue 函数插入单行数据
  2. QSqlQuery sqlQuery;
  3. sqlQuery.prepare("INSERT INTO student VALUES(:id,:name,:age)");
  4. sqlQuery.bindValue(":id", max_id + 1);
  5. sqlQuery.bindValue(":name", "Wang");
  6. sqlQuery.bindValue(":age", 25);
  7. if(!sqlQuery.exec())
  8. {
  9. qDebug() << "Error: Fail to insert data. " << sqlQuery.lastError();
  10. }
  11. else
  12. {
  13. // do something
  14. }
  15. // 方法二:使用 addBindValue 函数插入单行数据
  16. QSqlQuery sqlQuery;
  17. sqlQuery.prepare("INSERT INTO student VALUES(?, ?, ?)");
  18. sqlQuery.addBindValue(max_id + 1);
  19. sqlQuery.addBindValue("Wang");
  20. sqlQuery.addBindValue(25);
  21. if(!sqlQuery.exec())
  22. {
  23. qDebug() << "Error: Fail to insert data. " << sqlQuery.lastError();
  24. }
  25. else
  26. {
  27. // do something
  28. }
  29. // 方法三:直接写出完整语句
  30. if(!sql_query.exec("INSERT INTO student VALUES(3, "Li", 23)"))
  31. {
  32. qDebug() << "Error: Fail to insert data. " << sqlQuery.lastError();
  33. }
  34. else
  35. {
  36. // do something
  37. }

例3:查询全部数据

  1. QSqlQuery sqlQuery;
  2. sqlQuery.exec("SELECT * FROM student");
  3. if(!sqlQuery.exec())
  4. {
  5. qDebug() << "Error: Fail to query table. " << sqlQuery.lastError();
  6. }
  7. else
  8. {
  9. while(sqlQuery.next())
  10. {
  11. int id = sqlQuery.value(0).toInt();
  12. QString name = sqlQuery.value(1).toString();
  13. int age = sqlQuery.value(2).toInt();
  14. qDebug()<<QString("id:%1 name:%2 age:%3").arg(id).arg(name).arg(age);
  15. }
  16. }

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

  1. QSqlQuery sqlQuery;
  2. sqlQuery.prepare("UPDATE student SET name=?,age=? WHERE id=?");
  3. sqlQuery.addBindValue(name);
  4. sqlQuery.addBindValue(age);
  5. sqlQuery.addBindValue(id);
  6. if(!sqlQuery.exec())
  7. {
  8. qDebug() << sqlQuery.lastError();
  9. }
  10. else
  11. {
  12. qDebug() << "updated data success!";
  13. }

3、完整示例程序

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

SqliteOperator.h

  1. #ifndef SQLITEOPERATOR_H
  2. #define SQLITEOPERATOR_H
  3. #include <QSqlDatabase>
  4. #include <QSqlQuery>
  5. #include <QSqlError>
  6. #include <QDebug>
  7. typedef struct
  8. {
  9. int id;
  10. QString name;
  11. int age;
  12. }w2dba;
  13. class SqliteOperator
  14. {
  15. public:
  16. SqliteOperator();
  17. // 打开数据库
  18. bool openDb(void);
  19. // 创建数据表
  20. void createTable(void);
  21. // 判断数据表是否存在
  22. bool isTableExist(QString& tableName);
  23. // 查询全部数据
  24. void queryTable();
  25. // 插入数据
  26. void singleInsertData(w2dba &singleData); // 插入单条数据
  27. void moreInsertData(QList<w2dba> &moreData); // 插入多条数据
  28. // 修改数据
  29. void modifyData(int id, QString name, int age);
  30. // 删除数据
  31. void deleteData(int id);
  32. //删除数据表
  33. void deleteTable(QString& tableName);
  34. // 关闭数据库
  35. void closeDb(void);
  36. private:
  37. QSqlDatabase database;// 用于建立和数据库的连接
  38. };
  39. #endif // SQLITEOPERATOR_H

SqliteOperator.cpp

  1. #include "sqliteoperator.h"
  2. // 构造函数中初始化数据库对象,并建立数据库
  3. SqliteOperator::SqliteOperator()
  4. {
  5. if (QSqlDatabase::contains("qt_sql_default_connection"))
  6. {
  7. database = QSqlDatabase::database("qt_sql_default_connection");
  8. }
  9. else
  10. {
  11. // 建立和SQlite数据库的连接
  12. database = QSqlDatabase::addDatabase("QSQLITE");
  13. // 设置数据库文件的名字
  14. database.setDatabaseName("MyDataBase.db");
  15. }
  16. }
  17. // 打开数据库
  18. bool SqliteOperator::openDb()
  19. {
  20. if (!database.open())
  21. {
  22. qDebug() << "Error: Failed to connect database." << database.lastError();
  23. }
  24. else
  25. {
  26. // do something
  27. }
  28. return true;
  29. }
  30. // 创建数据表
  31. void SqliteOperator::createTable()
  32. {
  33. // 用于执行sql语句的对象
  34. QSqlQuery sqlQuery;
  35. // 构建创建数据库的sql语句字符串
  36. QString createSql = QString("CREATE TABLE student (
  37. id INT PRIMARY KEY NOT NULL,
  38. name TEXT NOT NULL,
  39. age INT NOT NULL)");
  40. sqlQuery.prepare(createSql);
  41. // 执行sql语句
  42. if(!sqlQuery.exec())
  43. {
  44. qDebug() << "Error: Fail to create table. " << sqlQuery.lastError();
  45. }
  46. else
  47. {
  48. qDebug() << "Table created!";
  49. }
  50. }
  51. // 判断数据库中某个数据表是否存在
  52. bool SqliteOperator::isTableExist(QString& tableName)
  53. {
  54. QSqlDatabase database = QSqlDatabase::database();
  55. if(database.tables().contains(tableName))
  56. {
  57. return true;
  58. }
  59. return false;
  60. }
  61. // 查询全部数据
  62. void SqliteOperator::queryTable()
  63. {
  64. QSqlQuery sqlQuery;
  65. sqlQuery.exec("SELECT * FROM student");
  66. if(!sqlQuery.exec())
  67. {
  68. qDebug() << "Error: Fail to query table. " << sqlQuery.lastError();
  69. }
  70. else
  71. {
  72. while(sqlQuery.next())
  73. {
  74. int id = sqlQuery.value(0).toInt();
  75. QString name = sqlQuery.value(1).toString();
  76. int age = sqlQuery.value(2).toInt();
  77. qDebug()<<QString("id:%1 name:%2 age:%3").arg(id).arg(name).arg(age);
  78. }
  79. }
  80. }
  81. // 插入单条数据
  82. void SqliteOperator::singleInsertData(w2dba &singledb)
  83. {
  84. QSqlQuery sqlQuery;
  85. sqlQuery.prepare("INSERT INTO student VALUES(:id,:name,:age)");
  86. sqlQuery.bindValue(":id", singledb.id);
  87. sqlQuery.bindValue(":name", singledb.name);
  88. sqlQuery.bindValue(":age", singledb.age);
  89. if(!sqlQuery.exec())
  90. {
  91. qDebug() << "Error: Fail to insert data. " << sqlQuery.lastError();
  92. }
  93. else
  94. {
  95. // do something
  96. }
  97. }
  98. // 插入多条数据
  99. void SqliteOperator::moreInsertData(QList<w2dba>& moredb)
  100. {
  101. // 进行多个数据的插入时,可以利用绑定进行批处理
  102. QSqlQuery sqlQuery;
  103. sqlQuery.prepare("INSERT INTO student VALUES(?,?,?)");
  104. QVariantList idList,nameList,ageList;
  105. for(int i=0; i< moredb.size(); i++)
  106. {
  107. idList << moredb.at(i).id;
  108. nameList << moredb.at(i).name;
  109. ageList << moredb.at(i).age;
  110. }
  111. sqlQuery.addBindValue(idList);
  112. sqlQuery.addBindValue(nameList);
  113. sqlQuery.addBindValue(ageList);
  114. if (!sqlQuery.execBatch()) // 进行批处理,如果出错就输出错误
  115. {
  116. qDebug() << sqlQuery.lastError();
  117. }
  118. }
  119. // 修改数据
  120. void SqliteOperator::modifyData(int id, QString name, int age)
  121. {
  122. QSqlQuery sqlQuery;
  123. sqlQuery.prepare("UPDATE student SET name=?,age=? WHERE id=?");
  124. sqlQuery.addBindValue(name);
  125. sqlQuery.addBindValue(age);
  126. sqlQuery.addBindValue(id);
  127. if(!sqlQuery.exec())
  128. {
  129. qDebug() << sqlQuery.lastError();
  130. }
  131. else
  132. {
  133. qDebug() << "updated data success!";
  134. }
  135. }
  136. // 删除数据
  137. void SqliteOperator::deleteData(int id)
  138. {
  139. QSqlQuery sqlQuery;
  140. sqlQuery.exec(QString("DELETE FROM student WHERE id = %1").arg(id));
  141. if(!sqlQuery.exec())
  142. {
  143. qDebug()<<sqlQuery.lastError();
  144. }
  145. else
  146. {
  147. qDebug()<<"deleted data success!";
  148. }
  149. }
  150. //删除数据表
  151. void SqliteOperator::deleteTable(QString& tableName)
  152. {
  153. QSqlQuery sqlQuery;
  154. sqlQuery.exec(QString("DROP TABLE %1").arg(tableName));
  155. if(sqlQuery.exec())
  156. {
  157. qDebug() << sqlQuery.lastError();
  158. }
  159. else
  160. {
  161. qDebug() << "deleted table success";
  162. }
  163. }
  164. void SqliteOperator::closeDb(void)
  165. {
  166. database.close();
  167. }

main.cpp

  1. #include <QCoreApplication>
  2. #include "sqliteoperator.h"
  3. #include <QString>
  4. int main(int argc, char *argv[])
  5. {
  6. QCoreApplication a(argc, argv);
  7. //创建并打开SQLite数据库
  8. SqliteOperator sqlTest;
  9. sqlTest.openDb();
  10. // 创建数据表
  11. sqlTest.createTable();
  12. // 判断数据表是否存在
  13. QString str1 = QString("student");
  14. qDebug() << "isTabelExist:" <<sqlTest.isTableExist(str1);
  15. // 插入单条数据
  16. w2dba w2dbaTest1 = {1, "zhangSan", 24};
  17. w2dba w2dbaTest2 = {2, "lisi", 28};
  18. sqlTest.singleInsertData(w2dbaTest1);
  19. sqlTest.singleInsertData(w2dbaTest2);
  20. // 插入多条数据
  21. QList<w2dba> list;
  22. w2dba w2dbaTest3 = {3, "liwu", 26};
  23. w2dba w2dbaTest4 = {4, "niuer", 27};
  24. list.append(w2dbaTest3);
  25. list.append(w2dbaTest4);
  26. sqlTest.moreInsertData(list);
  27. // 查询全部数据
  28. sqlTest.queryTable();
  29. qDebug() << endl;
  30. // 修改数据
  31. sqlTest.modifyData(2, "modify", 10);
  32. // 查询全部数据
  33. sqlTest.queryTable();
  34. qDebug() << endl;
  35. // 删除数据
  36. sqlTest.deleteData(2);
  37. // 查询全部数据
  38. sqlTest.queryTable();
  39. qDebug() << endl;
  40. // 删除数据表
  41. QString str2 = QString("student");
  42. sqlTest.deleteTable(str2);
  43. //关闭数据库
  44. sqlTest.closeDb();
  45. return a.exec();
  46. }

运行结果如下:

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数据库的详细内容,更多关于Qt怎么操作SQLite数据库的资料请关注九品源码其它相关文章!