IT评测·应用市场-qidao123.com

标题: Qt 中利用 SQLite 数据库的完整指南 [打印本页]

作者: 科技颠覆者    时间: 2025-3-10 20:20
标题: Qt 中利用 SQLite 数据库的完整指南
SQLite 是一款轻量级、嵌入式的关系型数据库,无需独立的服务器进程,数据以文件形式存储,非常适合桌面和移动端应用的本地数据管理。Qt 通过 Qt SQL 模块提供了对 SQLite 的原生支持,开发者可以轻松实现数据库的增删改查、事务处置惩罚等操作。本文将具体先容如安在 Qt 中集成并利用 SQLite 数据库。

1. 环境配置与准备工作

1.1 启用 Qt SQL 模块

在 Qt 项目文件(.pro)中添加 SQL 模块依赖:
   QT += sql
  1.2 包罗头文件

在代码中引入必要的类:
   #include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QSqlTableModel>

  
2. 连接 SQLite 数据库

2.1 创建并打开数据库

  1. QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
  2. db.setDatabaseName("my_database.db"); // 数据库文件名(或完整路径)
  3. if (!db.open()) {
  4.     qDebug() << "Error: Failed to open database:" << db.lastError().text();
  5.     return;
  6. }
复制代码

2.2 关闭数据库

   db.close(); // 显式关闭连接(通常不需要,程序退出时主动关闭)
  
3. 实行 SQL 操作

3.1 创建表

  1. QSqlQuery query;
  2. query.exec("CREATE TABLE IF NOT EXISTS users ("
  3.           "id INTEGER PRIMARY KEY AUTOINCREMENT,"
  4.           "name TEXT NOT NULL,"
  5.           "age INTEGER,"
  6.           "email TEXT UNIQUE)");
复制代码
3.2 插入数据

直接实行 SQL

  1. query.exec("INSERT INTO users (name, age, email) VALUES ('Alice', 30, 'alice@example.com')");
复制代码
利用预处置惩罚语句(防 SQL 注入)

  1. query.prepare("INSERT INTO users (name, age, email) VALUES (?, ?, ?)");
  2. query.addBindValue("Bob");
  3. query.addBindValue(25);
  4. query.addBindValue("bob@example.com");
  5. query.exec();
复制代码
3.3 查询数据

  1. if (query.exec("SELECT id, name, age FROM users WHERE age > 20")) {
  2.     while (query.next()) {
  3.         int id = query.value(0).toInt();
  4.         QString name = query.value("name").toString();
  5.         int age = query.value(2).toInt();
  6.         qDebug() << "User:" << id << name << age;
  7.     }
  8. } else {
  9.     qDebug() << "Query error:" << query.lastError().text();
  10. }
复制代码
3.4 更新与删除数据

  1. // 更新
  2. query.exec("UPDATE users SET age = 31 WHERE name = 'Alice'");
  3. // 删除
  4. query.exec("DELETE FROM users WHERE email IS NULL");
复制代码

4. 事务处置惩罚

通过事务确保多个操作的原子性:
  1. db.transaction(); // 开始事务
  2. QSqlQuery query;
  3. query.exec("UPDATE account SET balance = balance - 100 WHERE id = 1");
  4. query.exec("UPDATE account SET balance = balance + 100 WHERE id = 2");
  5. if (/* 检查操作是否成功 */) {
  6.     db.commit();   // 提交事务
  7. } else {
  8.     db.rollback(); // 回滚事务
  9. }
复制代码

5. 利用模型-视图(Model-View)编程

Qt 提供了 QSqlTableModel 和 QSqlQueryModel,方便将数据库与 UI 组件(如 QTableView)绑定。
5.1 显示表格数据

  1. QSqlTableModel *model = new QSqlTableModel(this);
  2. model->setTable("users");
  3. model->setFilter("age > 20");
  4. model->select();
  5. QTableView *view = new QTableView;
  6. view->setModel(model);
  7. view->show();
复制代码
5.2 编辑并生存修改

  1. model->setEditStrategy(QSqlTableModel::OnManualSubmit);
  2. // 用户通过视图修改数据后调用:
  3. model->submitAll(); // 提交所有更改到数据库
复制代码

6. 错误处置惩罚与调试

6.1 捕捉数据库错误

  1. if (!query.exec("INVALID SQL")) {
  2.     qDebug() << "SQL Error:" << query.lastError().text();
  3.     qDebug() << "Executed SQL:" << query.lastQuery();
  4. }
复制代码
6.2 查看支持的数据库驱动

  1. qDebug() << "Available drivers:" << QSqlDatabase::drivers();
  2. // 输出示例:("QSQLITE", "QMYSQL", "QPSQL")
复制代码

7. 高级本事与注意事项

7.1 批量插入优化

利用事务加速大批量插入:
  1. db.transaction();
  2. QSqlQuery query;
  3. query.prepare("INSERT INTO users (name) VALUES (?)");
  4. for (const QString &name : namesList) {
  5.     query.addBindValue(name);
  6.     query.exec();
  7. }
  8. db.commit();
复制代码
7.2 多线程访问


7.3 数据库迁移



8. 常见问题解答

Q1:数据库文件被锁定了怎么办?


Q2:怎样防止 SQL 注入?


Q3:查询性能慢怎样优化?



9. 完整示例代码

  1. #include <QCoreApplication>
  2. #include <QSqlDatabase>
  3. #include <QSqlQuery>
  4. #include <QDebug>
  5. int main(int argc, char *argv[]) {
  6.     QCoreApplication a(argc, argv);
  7.     QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
  8.     db.setDatabaseName("test.db");
  9.    
  10.     if (!db.open()) {
  11.         qDebug() << "Database error:" << db.lastError().text();
  12.         return -1;
  13.     }
  14.     QSqlQuery query;
  15.     query.exec("CREATE TABLE IF NOT EXISTS books ("
  16.                "id INTEGER PRIMARY KEY,"
  17.                "title TEXT,"
  18.                "author TEXT)");
  19.     query.prepare("INSERT INTO books (title, author) VALUES (?, ?)");
  20.     query.addBindValue("Qt Programming");
  21.     query.addBindValue("John Doe");
  22.     query.exec();
  23.     query.exec("SELECT * FROM books");
  24.     while (query.next()) {
  25.         qDebug() << "Book:" << query.value("title").toString()
  26.                  << "by" << query.value("author").toString();
  27.     }
  28.     db.close();
  29.     return a.exec();
  30. }
复制代码

10. 总结

Qt 的 SQLite 支持使得本地数据管理变得简朴高效。焦点要点包括:

官方文档参考


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4