当前位置: 首页 > news >正文

Qt数据库编程详解:SQLite实战指南

Qt数据库编程详解:SQLite实战指南


目录
  1. SQLite数据库简介
  2. Qt数据库核心类
  3. 数据库操作全流程
  4. CRUD操作实战
  5. 运行效果展示

1. SQLite数据库简介

SQLite是Qt内置的轻量级嵌入式数据库:

SQLite特点
零配置
无服务器
单文件存储
事务支持

核心优势

  • 无需单独安装或配置
  • 数据库存储在单个文件中(.db或.db3后缀)
  • 支持标准SQL语法
  • 适用于嵌入式设备和移动应用
  • Qt提供原生支持(无需额外驱动)

⚠️ 使用前需在.pro文件添加:QT += sql


2. Qt数据库核心类

数据库操作双核心类:
类名作用关键方法
QSqlDatabase数据库连接管理addDatabase(), open(), close()
QSqlQuerySQL语句执行和结果集操作exec(), prepare(), next()
QSqlTableModel数据表模型(高级操作)setTable(), select()
QSqlError数据库错误处理text(), type()
类关系图:
QSqlDatabase
QSqlQuery
QSqlError
QSqlRecord
QSqlTableModel

3. 数据库操作全流程

六步完成数据库操作:
AppDatabase1. 添加数据库驱动2. 设置连接参数3. 打开数据库连接4. 执行SQL语句5. 处理结果集6. 关闭连接AppDatabase

4. CRUD操作实战

(1) 创建数据库和数据表
// 添加SQLite驱动
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("contacts.db");  // 数据库文件// 打开数据库
if(!db.open()) {qDebug() << "数据库打开失败:" << db.lastError().text();return;
}// 创建数据表
QSqlQuery query;
query.exec("CREATE TABLE IF NOT EXISTS contacts (""id INTEGER PRIMARY KEY AUTOINCREMENT, ""name TEXT NOT NULL, ""phone TEXT, ""email TEXT)");
(2) 插入数据(Create)
// 准备插入语句
query.prepare("INSERT INTO contacts (name, phone, email) ""VALUES (:name, :phone, :email)");// 绑定值
query.bindValue(":name", "张三");
query.bindValue(":phone", "13800138000");
query.bindValue(":email", "zhangsan@example.com");// 执行插入
if(!query.exec()) {qDebug() << "插入失败:" << query.lastError().text();
}
(3) 查询数据(Read)
query.exec("SELECT * FROM contacts");
while(query.next()) {int id = query.value("id").toInt();QString name = query.value("name").toString();QString phone = query.value("phone").toString();qDebug() << "ID:" << id << "| 姓名:" << name << "| 电话:" << phone;
}
(4) 更新数据(Update)
query.prepare("UPDATE contacts SET phone = :phone WHERE name = :name");
query.bindValue(":phone", "13900139000");
query.bindValue(":name", "张三");
query.exec();
(5) 删除数据(Delete)
query.exec("DELETE FROM contacts WHERE name = '李四'");
(6) 使用模型视图(高级)
QSqlTableModel *model = new QSqlTableModel;
model->setTable("contacts");
model->select();// 在表格视图中显示
QTableView *view = new QTableView;
view->setModel(model);
view->show();

5. 运行效果展示

数据库文件结构:
contacts.db 文件内容:
┌────┬─────────┬──────────────┬──────────────────────┐
│ id │ name    │ phone        │ email                │
├────┼─────────┼──────────────┼──────────────────────┤
│ 1  │ 张三    │ 13900139000  │ zhangsan@example.com │
│ 2  │ 王五    │ 13700137000  │ wangwu@example.com   │
└────┴─────────┴──────────────┴──────────────────────┘
查询结果输出:
ID: 1 | 姓名: 张三 | 电话: 13900139000
ID: 2 | 姓名: 王五 | 电话: 13700137000

完整源码:GitHub数据库示例
官方文档

  • Qt SQL模块
  • SQLite语法参考
    最佳实践
  • 使用事务处理批量操作提升性能
  • 使用参数绑定防止SQL注入攻击
  • 数据库操作放在独立线程避免界面卡顿

原创技术笔记,转载需注明出处。更多系统编程内容持续更新中…

http://www.dtcms.com/a/273611.html

相关文章:

  • Vue 3 中父组件内两个子组件相互传参的几种方法
  • Vue 3 入门——自学习版本
  • DOM编程实例(不重要,可忽略)
  • 分享|2025年机器学习工程师职业技术证书报考指南
  • 论容器化 | 分析Go和Rust做医疗的后端服务
  • 在vue中使用Three.js渲染FBX模型
  • arcgis api for js 设置地图服务请求带有请求头信息
  • 录音实时上传
  • uniapp
  • Claude Code是什么?国内如何使用到Claude Code?附国内最新使用教程
  • 基于定制开发开源AI智能名片与S2B2C商城小程序的旅游日志创新应用研究
  • uniapp小程序tabbar跳转拦截与弹窗控制
  • Elasticsearch混合搜索深度解析(上):问题发现与源码探索
  • Excel 转 JSON by WTSolutions API 文档
  • 较为深入的了解c++中的string类(2)
  • MyBatis 从入门到实战:代理 Dao 模式下的 CRUD 全解析
  • Netplan 配置网桥(Bridge)的模板笔记250711
  • excel如何只保留前几行
  • 提示工程:解锁大模型潜力的核心密码
  • 基于redis的分布式session共享管理之销毁事件不生效问题
  • 这个方法的目的是检查一个给定的项目ID(projectId)是否在当前数据库中被使用(搜索全库)
  • SortByCustomOrder 根据指定的顺序对任意类型的列表进行排序
  • Python七彩花朵
  • 【实时Linux实战系列】实时系统测试与合规认证指南
  • 二刷 黑马点评 商户查询缓存
  • <script>标签对HTML文件解析过程的影响以及async和defer属性的应用
  • 在 React Three Fiber 中实现 3D 模型点击扩散波效果
  • 车企战略投资项目管理的实践与思考︱中国第一汽车集团进出口有限公司战略部投资管理专家庞博
  • 台球 PCOL:极致物理还原的网页斯诺克引擎(附源码深度解析)
  • 软件设计师中级逻辑公式题