21人参与 • 2025-04-21 • MsSqlserver
sqlite 是一款轻量级、嵌入式的关系型数据库,无需独立的服务器进程,数据以文件形式存储,非常适合桌面和移动端应用的本地数据管理。qt 通过 qt sql 模块提供了对 sqlite 的原生支持,开发者可以轻松实现数据库的增删改查、事务处理等操作。本文将详细介绍如何在 qt 中集成并使用 sqlite 数据库。
在 qt 项目文件(.pro
)中添加 sql 模块依赖:
qt += sql
在代码中引入必要的类:
#include <qsqldatabase>
#include <qsqlquery>
#include <qsqlerror>
#include <qsqltablemodel>
qsqldatabase db = qsqldatabase::adddatabase("qsqlite"); db.setdatabasename("my_database.db"); // 数据库文件名(或完整路径) if (!db.open()) { qdebug() << "error: failed to open database:" << db.lasterror().text(); return; }
说明:
qsqlite
是 qt 内置的 sqlite 驱动名称。
如果文件不存在,sqlite 会自动创建新数据库。
db.close(); // 显式关闭连接(通常不需要,程序退出时自动关闭)
qsqlquery query; query.exec("create table if not exists users (" "id integer primary key autoincrement," "name text not null," "age integer," "email text unique)");
直接执行 sql
query.exec("insert into users (name, age, email) values ('alice', 30, 'alice@example.com')");
使用预处理语句(防 sql 注入)
query.prepare("insert into users (name, age, email) values (?, ?, ?)"); query.addbindvalue("bob"); query.addbindvalue(25); query.addbindvalue("bob@example.com"); query.exec();
if (query.exec("select id, name, age from users where age > 20")) { while (query.next()) { int id = query.value(0).toint(); qstring name = query.value("name").tostring(); int age = query.value(2).toint(); qdebug() << "user:" << id << name << age; } } else { qdebug() << "query error:" << query.lasterror().text(); }
// 更新 query.exec("update users set age = 31 where name = 'alice'"); // 删除 query.exec("delete from users where email is null");
通过事务确保多个操作的原子性:
db.transaction(); // 开始事务 qsqlquery query; query.exec("update account set balance = balance - 100 where id = 1"); query.exec("update account set balance = balance + 100 where id = 2"); if (/* 检查操作是否成功 */) { db.commit(); // 提交事务 } else { db.rollback(); // 回滚事务 }
qt 提供了 qsqltablemodel
和 qsqlquerymodel
,方便将数据库与 ui 组件(如 qtableview
)绑定。
qsqltablemodel *model = new qsqltablemodel(this); model->settable("users"); model->setfilter("age > 20"); model->select(); qtableview *view = new qtableview; view->setmodel(model); view->show();
model->seteditstrategy(qsqltablemodel::onmanualsubmit); // 用户通过视图修改数据后调用: model->submitall(); // 提交所有更改到数据库
if (!query.exec("invalid sql")) { qdebug() << "sql error:" << query.lasterror().text(); qdebug() << "executed sql:" << query.lastquery(); }
qdebug() << "available drivers:" << qsqldatabase::drivers(); // 输出示例:("qsqlite", "qmysql", "qpsql")
使用事务加速大批量插入:
db.transaction(); qsqlquery query; query.prepare("insert into users (name) values (?)"); for (const qstring &name : nameslist) { query.addbindvalue(name); query.exec(); } db.commit();
sqlite 默认不支持多线程同时写入,需通过 qsqldatabase::clonedatabase
为每个线程创建独立连接。
在子线程中使用数据库时,确保在子线程内打开连接。
使用 user_version
字段管理数据库版本:
query.exec("pragma user_version = 1"); // 设置版本号 query.exec("pragma user_version"); // 读取版本号
确保所有 qsqlquery
和 qsqldatabase
对象在使用后及时释放。
避免多线程同时写入同一连接。
始终使用 prepare()
和 addbindvalue()
替代字符串拼接。
为常用查询字段添加索引。
减少频繁的小事务,合并为批量操作。
#include <qcoreapplication> #include <qsqldatabase> #include <qsqlquery> #include <qdebug> int main(int argc, char *argv[]) { qcoreapplication a(argc, argv); qsqldatabase db = qsqldatabase::adddatabase("qsqlite"); db.setdatabasename("test.db"); if (!db.open()) { qdebug() << "database error:" << db.lasterror().text(); return -1; } qsqlquery query; query.exec("create table if not exists books (" "id integer primary key," "title text," "author text)"); query.prepare("insert into books (title, author) values (?, ?)"); query.addbindvalue("qt programming"); query.addbindvalue("john doe"); query.exec(); query.exec("select * from books"); while (query.next()) { qdebug() << "book:" << query.value("title").tostring() << "by" << query.value("author").tostring(); } db.close(); return a.exec(); }
qt 的 sqlite 支持使得本地数据管理变得简单高效。核心要点包括:
使用 qsqldatabase
管理数据库连接。
通过 qsqlquery
执行 sql 语句并处理结果。
利用事务保证数据一致性。
结合模型-视图框架快速构建 ui 界面。
官方文档参考:
到此这篇关于qt中集成并使用sqlite数据库的文章就介绍到这了,更多相关qt集成使用sqlite数据库内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论