QT 中 sqlite 数据库使用

一、前提

cpp 复制代码
	--pro文件添加sql模块
	QT += core gui sql

二、使用

说明
sql 复制代码
	--用于与数据库建立连接
	QSqlDatabase
	--执行各种sql语句
	QSqlQuery
	--提供数据库特定的错误信息
	QSqlError
查看qt支持的驱动
cpp 复制代码
    QStringList list = QSqlDatabase::drivers();
    qDebug()<<list;
连接 sqlite3 数据库

声明:

cpp 复制代码
	#include <QSqlDatabase>
	QSqlDatabase db;	//该类对象,就相当于一个数据库

实现:

cpp 复制代码
	--通常放在构造函数中
	// 加载驱动
	db = QSqlDatabase::addDatabase("QSQLITE");  //QSQLITE驱动--连接的是sqlite3数据库
	                                            //连接成功,返回一个数据库对象
	// 设置数据库名
	db.setDatabaseName("company.db");//数据库文件后缀:.db	
	// 打开数据库  
	if(!db.open())  //open打开成功返回 true                
	{               
	    qDebug()<<"数据库打开失败:"<<db.lastError();   //lastError:返回有关数据库上发生的最后一个错误的信息。
	}
执行 sql 语句
cpp 复制代码
    // 创建对象
    QSqlQuery query;    //创建该对象是,系统自动完成和数据库的关联
    // 定义一条创建表的sql语句
    QString createTable = "create table staffInformation (id integer, name varchar(20), age int) ";
    // 执行sql语句
    if(!query.exec(createTable)){
        qDebug() <<"create table error:" <<db.lastError();
    }
cpp 复制代码
    // 插入数据
    QString insertData = "insert into staffInformation(id, name, age) values(1, 'chen', 18)";
    // 执行sql语句
    if(!query.exec(insertData)){
        qDebug() <<"insert data error:" <<db.lastError();
    }
cpp 复制代码
	// 查询数据
    QString selectData = "select * from staffInformation";
    // 执行sql语句
    if(!query.exec(selectData)){
        qDebug() <<"select data error:" <<db.lastError();
    }else{
        while (query.next()) {
            qDebug() <<query.value("id").toUInt()
                     <<query.value("name").toString()
                     <<query.value("age").toUInt();
        }
    }
cpp 复制代码
    //删除数据
    QString deleteData = "delete from staffInformation where id = 1;";
    // 执行sql语句
    if(!query.exec(deleteData)){
        qDebug() <<"delete data error:" <<db.lastError();
    }
cpp 复制代码
    // 更新数据
    QString updateData = "update staffInformation set name = 'yuan' where id = 1;";
    // 执行sql语句
    if(!query.exec(updateData)){
        qDebug() <<"update data error:" <<db.lastError();
    }
使用 QSqlQueryModel 模型查询数据( QSqlQUeryModel 默认是只读数据模型)
cpp 复制代码
    // 创建对象,并设置表头信息
    QSqlQueryModel *model = new QSqlQueryModel;
    // 执行sql语句
    model->setQuery("select * from staffInformation");	//将查询的结果转换成model对象(结果集)
    // 根据需求设置表头信息
    model->setHeaderData(0, Qt::Horizontal, "id");
    model->setHeaderData(1, Qt::Horizontal, "name");
    model->setHeaderData(2, Qt::Horizontal, "age");
    // 给ui控件设置模型
    QTableView *tableView = new QTableView(this);
    tableView->setFixedSize(this->width(), this->height());//设置tableView大小
    tableView->setModel(model);	//传入表格模型
    tableView->show();   //显示表格
使用 QSqlQueryModel 模型修改数据

1,创建一个类,重写 QSqlQueryModel 虚函数

cpp 复制代码
public:
    //重写基类虚函数
    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); //修改数据库数据
    Qt::ItemFlags flags(const QModelIndex &index) const;    // 表格可编辑状态设置

private:
    //自定义函数接口
    void refresh();//更新数据

    bool setName(int useId, const QString &name);//根据需求修改表中的数据
cpp 复制代码
//修改数据库数据
bool eidtQueryModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    //判断是否有效列
    if(index.column() < 1 || index.column() > 3)
        return false;
    
    //获取列对应的 id
    QModelIndex prinmaryIndex = QSqlQueryModel::index(index.row(), 0);
    int id = this->data(prinmaryIndex).toInt(); //获取表中字段的 id

    // 在修改行时,将整个model清空
    this->clear();

    //根据需求修改对应的列
    bool ok = false  ;
    if(index.column() == 1)
    {
        ok = setName(id, value.toString());
    }

    //刷新数据
    refresh();
    return ok;
}

// 表格可编辑状态设置
Qt::ItemFlags eidtQueryModel::flags(const QModelIndex &index) const
{
    // 获取原有单元格的编辑状态
    Qt::ItemFlags flag = QSqlQueryModel::flags(index);

    // 给原有标志位增加一个可编辑的标志
    if(index.column() == 1) //仅限第一列可编辑
        flag = flag | Qt::ItemIsEditable;   //给它设置一个可编辑的状态

    return flag;
}

//更新数据
void eidtQueryModel::refresh()
{
    //相当于将数据库的数据查询出来,转换成一个model
    this->setQuery("select * from staffInformation");
    this->setHeaderData(0, Qt::Horizontal, "name"); //设置表头
}

//根据需求修改表中的数据
bool eidtQueryModel::setName(int useId, const QString &name)
{
    //相当于一个刷新操作
    QSqlQuery query;
    query.prepare("update staffInformation set name = ? where id = ?");
    query.addBindValue(name);
    query.addBindValue(useId);
    return query.exec();
}

2,使用

cpp 复制代码
    // 创建模型对象
    eidtQueryModel *model = new eidtQueryModel;
    //执行sql
    model->setQuery("select id, name, age from staffInformation");
    //设置表头
    model->setHeaderData(0, Qt::Horizontal, "id");
    model->setHeaderData(1, Qt::Horizontal, "name");
    model->setHeaderData(2, Qt::Horizontal, "age");

    //给ui控件设置模型
    QTableView *tableView = new QTableView(this);
    tableView->setFixedSize(this->width(), this->height());//设置tableView大小
    tableView->setModel(model);// 传入表格模型
    tableView->show();   // 显示表格

三、其他



相关推荐
白露与泡影2 小时前
Redis 缓存实战:雪崩、穿透、击穿一次讲透
数据库·redis·缓存
GIS阵地2 小时前
QgsRasterDataProvider 完整详解(QGIS 3.40.13 C++)
开发语言·c++·qt·开源软件·qgis
赵渝强老师3 小时前
【赵渝强老师】使用Oracle可传输的表空间迁移数据
数据库·oracle
IpdataCloud4 小时前
跨区服玩家延迟高怎么办?用IP离线库自动分配到最近服务器
数据库·tcp/ip·github·php·ip
wuqingshun3141595 小时前
MYSQL默认的事务隔离级别是什么?为什么选择这个级别?
数据库·mysql
空中湖6 小时前
电池简史(五):极限之梦与终章——锂硫、锂空气、量子电池,以及你该知道的电池投资与生活指南
数据库·程序人生
蓝胖子酱7 小时前
在 Electron 中用 electron-store 实现加密存储与自定义格式文件
前端·javascript·数据库
snow@li8 小时前
Redis:数据库语法速查表 / 全景梳理
数据库·redis·缓存
Devlive 开源社区8 小时前
Nebula 1.6.0 发布:跨区域桶自动路由、秒传、文本/PDF 预览一次到位
数据库·sql
这个DBA有点耶8 小时前
导个数据中文全变问号?字符集这事儿真没那么简单
数据库·mysql·代码规范