Qt提供了一种进程内数据库SQLite。它小巧灵活,无须额外安装配置且支持大部分ANSI SQL92标准,是一个轻量级的数据库,概括起来具有以下优点。
- SQLite的设计目的是实现 嵌入式SQL数据库引擎,它基于纯C语言代码,已经应用在非常广泛的领域内。
- SQLite在需要持久存储时可以直接读写硬盘上的数据文件,在无须持久存储时也可以将整个数据库置于内存中,两者均不需要额外的服务器端进程,即SQLite是无须独立运行的数据库引擎。
- 开放源代码,整套代码少于3万行,有良好的注释和90%以上的测试覆盖率。
- 少于250KB的内存占用容量(gcc编译情况下)。
- 支持视图、触发器和事务,支持嵌套SQL功能。
- 提供虚拟机用于处理SQL语句。
- 不需要配置,不需要安装,也不需要管理员。
- 支持大部分ANSI SQL92标准。
- 大部分应用的速度比目前常见的客户端/服务器结构的数据库快。就3
- 编程接口简单易用。
目录
*
– 一、项目介绍
– 二、项目基本配置
– 三、UI界面设计
– 四、主程序实现
–
+ 4.1 pro文件
+ 4.2 main.cpp文件
– 五、效果演示
一、项目介绍
利用Qt对SQLite数据库完成数据的增、删、改、查等操作。
二、项目基本配置
新建一个Qt案例,项目名称为”SQLTest”,基类选择”QWidget”,取消创建UI界面复选框的选中状态,完成项目创建。
三、UI界面设计
无UI界面
四、主程序实现
4.1 pro文件
在SQLTest.pro文件中添加如下代码:
QT+=sql
4.2 main.cpp文件
源文件main.cpp中代码如下:
首先需要创建SQLite数据库,然后激活与数据库的物理连接:
QSqlDatabase db =QSqlDatabase::addDatabase ("QSQLITE");
db.setHostName ("SQLite-001") ;
db.setDatabaseName ("qtDB.db");
db.setUserName ("Wendy") ;
db.setPassword("123456") ;
db.open();
创建数据库表:
QSqlQuery query;
bool success=query.exec("create table automobil"
"(id int primary key,attribute varchar,"
"type varchar,kind varchar,nation int,"
"carnumber int,elevaltor int,"
"distance int,oil int,"
"temperature int)");
if (success)
qDebug()<<QObject::tr("数据库表创建成功!\n");
else
qDebug()<<QObject::tr("数据库表创建失败!\n");
I.数据查询:
query.exec("select * from automobil");
QSqlRecord rec=query.record();
qDebug()<<QObject::tr("automobile表的字段数:")<< rec.count();
II.数据插入:
QTime t;
t.start();
query.prepare("insert into automobil values(?,?,?,?,?,?,?,?,?,?)");
long records=100;
for (int i=0; i<records; i++){
query.bindValue(0,i) ;
query.bindValue(1, "四轮");
query.bindValue(2, "轿车");
query.bindValue(3,"富康") ;
query.bindValue(4,rand()%100);
query.bindValue(5,rand()%10000);
query.bindValue(6,rand()%300);
query.bindValue(7, rand()%200000);
query.bindValue(8,rand()%52);
query.bindValue(9,rand()%100);
success=query.exec();
if(!success){
QSqlError lastError=query.lastError();
qDebug ()<<lastError.driverText()<<QString(QObject::tr("插入失败"));
}
}
qDebug()<<QObject::tr("插入%1条记录,耗时:%2ms").arg (records).arg(t.elapsed());
t.restart() ;
success=query.exec("select * from automobil order by id desc") ;
if (success)
qDebug() <<QObject::tr("排序%1条记录,耗时:%2 ms").arg (records).arg(t.elapsed());
else
qDebug()<<QObject::tr("排序失败!");
III.数据修改:
t.restart();
for (int i=0;i<records;i++)
{
query.clear() ;
query.prepare(QString ("update automobil set attribute=?, type=?,"
"kind=?, nation=?,"
"carnumber=? ,elevaltor=?,"
"distance=?,oil=?, "
"temperature=? where id=%1").arg(i));
query.bindValue(0, "四轮") ;
query.bindValue(1, "轿车") ;
query.bindValue(2, "富康") ;
query.bindValue(3, rand()%100) ;
query.bindValue(4, rand()%10000);
query.bindValue(5, rand()%300);
query.bindValue(6, rand()%200000) ;
query.bindValue(7, rand()%52) ;
query.bindValue(8, rand()%100) ;
success=query.exec();
if (!success)
{
QSqlError lastError=query.lastError();
qDebug ()<<lastError.driverText()<<QString (QObject::tr ("更新失败"));
}
}
qDebug()<<QObject::tr("更新%1条记录,耗时:%2ms").arg (records).arg(t.elapsed());
IV.数据删除:
t.restart();
query.exec("delete from automobil where id=15") ;
qDebug()<<QObject::tr("删除一条记录,耗时:%1 ms") .arg(t.elapsed()) ;
return 0;
【注意】:以上代码均为Qt5相关代码,Qt6及以上版本取消了QTime类下的t.restart()函数和t.elapsed()函数,将其封装到了QElapsedTimer类中,请使用相应代码代替,完整代码参考:资源。
五、效果演示
完整效果如下:
生成的qtDB.db文件如下:
如果没有看懂的话,完整代码可以参考:https://download.csdn.net/download/didi_ya/76627517
当然,这里也提供了Qt6实现的相关代码,可以参考:https://download.csdn.net/download/didi_ya/76630272
ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~
Original: https://blog.csdn.net/didi_ya/article/details/122561177
Author: wendy_ya
Title: Qt实战案例(25)——利用QSQL相关类实现对SQLite数据库的增删改查操作
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/815776/
转载文章受原作者版权保护。转载请注明原作者出处!