10、QT—SQLite使用小记1

开发平台:Win10 64位
开发环境:Qt Creator 13.0.0
构建环境:Qt 5.15.2 +MSVC2019 64位
构建工具:qmake
在上一篇文章中笔者介绍了sqlite的使用,并提供了一个封装好的文件,这篇文章就针对封装好的文件进行测试下功能,并讲解下里面的函数参数。
源码链接:https://github.com/944414275/Sqlite



一、测试功能

  1. 创建数据库(打开数据库)
  2. 创建表(打开表)
  3. 插入数据
  4. 更新数据
  5. 查询数据
    通过几个按钮来测试
    在这里插入图片描述

二、测试分析

2.1 创建数据库(打开数据库)

创建数据库或者打开数据库上一篇文章已经讲的很明白了,这里就不再赘述了,下面看下使用效果。能在代码里面注释的,笔者就在代码中注释了。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QApplication>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //获取或设置数据库的位置
    dbPath=QApplication::applicationDirPath()+"/test.db";
	//封装的类,在.h文件中声明,这里实例化下,下面直接用这个sqlliteHelper对象操作
    sqlliteHelper=new SqliteHelper();
}

MainWindow::~MainWindow()
{
    delete ui;
}

//打开数据库
void MainWindow::on_pushButton_clicked()
{
	//直接调用OpenSqlite函数,这个函数有个返回值,打开了返回true,否则就false
    bool b = sqlliteHelper->OpenSqlite(dbPath,"test");
    if(b)
    {
        //输出乱码?
        qDebug()<<"连接成功";
    }else {
        qDebug()<<"连接失败";
    }
}
///
    /// \brief OpenSqlite 打开数据库
    /// \param dbName 数据库名,上一篇文章对这里说明了,可以默认也可以自定义
    /// \param connectName 连接名 同样上一篇文章也说,自定义的名,方便管理连接数据的
    /// \return
    ///
    bool OpenSqlite(const QString &dbName,const QString &connectName);
bool SqliteHelper::OpenSqlite(const QString &dbName, const QString &connectName)
{
	//先判断下有没有这个连接名,有的话,直接调用这个连接的数据库,并返回这个连接名所关联的数据库实例
	//这个就和多线程一样,每个线程都有一个名,线程池会先判断线程池里面有没有,有的化就直接提供给你,没有的话再创建个新的线程对象给你用
    if (QSqlDatabase::connectionNames().contains(connectName)) {

        sqlDb = QSqlDatabase::database(connectName);
    } else {
		//没有这个连接名,那就添加一个(添加记录上)
		//就好比有个小本本给你记上你领取了一件衣服,衣服类型是QSQLITE,名字就写上你(connectName)
		//过了一会你还回去了,又过了一会你又来借,就从小本本上看看你刚才借的还在不在,在的话就给你那一件,
		//如果不在了(拿去洗了或销毁了),就重新给你一件
        sqlDb = QSqlDatabase::addDatabase("QSQLITE", connectName);
    }
	//记录下这个连接名,可能会用到
    m_connectName = connectName;
	//先看下这个实例是否开着,如果开着就关上先
    if (sqlDb.isOpen()) {
        sqlDb.close();
    }
	//重新设置下数据库,就是具体的数据库比如test.db
    sqlDb.setDatabaseName(dbName);
    //判断下数据库对象是否打开着,打开着就实例化一个QSqlQuery对象,
    //之后的的增删改查操作就可以用这个实例化的对象了。
    if (sqlDb.open()) {
        m_query = QSqlQuery(sqlDb);
        //这里就直接退出函数了,下面的就不会执行了
        return true;
    }
	//如果上面的都不符合,就到这一步了,记录下错误
    m_lastError = sqlDb.lastError().text();
    return false;
}

2.2 创建表(打开表)

其实这个类的增删改查就是通过拼接函数参数来生成一个完成的合法的sql语句,并执行这个sql语句,可以看下参考文献4.2,和具体的sql语句对比下就明白了。

//创建表
void MainWindow::on_pushButton_2_clicked()
{
    QHash<QString, QString> qs;
    qs.insert("cust_id","char(10)");
    qs.insert("cust_name","char(50)");
    qs.insert("cust_address","char(50)");
    // 定义QList变量
    QList<QString> list;
    // 插入项目,作为主键
    list << "cust_id";

    sqlliteHelper->createTable("biao1",qs,list);
}
/**
     * @brief createTable 创建数据表
     * @param tableName 数据表名
     * @param fields 字段(字段名和类型,如{"name", "varchar(5)"})
     * @param pks 主键
     * @return
     */
    bool createTable(const QString &tableName, const QHash<QString, QString> &fields, const QList<QString> &pks);

在这里插入图片描述
结合上面这个图中内容去理解函数中参数的意义,tableName见名知意,fields就是表的表头,但是是个键值对,key像上图中的ID、NAME、AGE等,value就是后面的值类型INT、TEXT、CHAR(50)等。pks就是主键设置成哪个字段,是ID还是NAME或者其他再或者好几个都可以作为主键。


bool SqliteHelper::createTable(const QString &tableName, const QHash<QString, QString> &fields,
                               const QList<QString> &pks)
{
    //如果存在就返回
    if (isExistTable(tableName)) {
        m_lastError = QString("Table [%1] is already exist").arg(tableName);
        return false;
    }

    //不存在,开始拼接字符串
    QString sql = QString("create table %1 (").arg(tableName);

    for (auto iter = fields.begin(); iter != fields.end(); ++iter) {
        sql.append(QString("%1 %2, ").arg(iter.key(), iter.value()));
    }

    sql.append(QString("primary key ("));
    qDebug()<<sql;
    for (const auto &item : pks) {
        sql.append(QString("%1, ").arg(item));
    }
    qDebug()<<sql;
    sql.remove(sql.length() - 2, 2);
    sql.append("))");
    qDebug()<<sql;
    if (m_query.exec(sql)) {
        return true;
    }

    m_lastError = m_query.lastError().text();
    return false;
}
bool SqliteHelper::isExistTable(const QString &tableName)
{
    return sqlDb.tables().contains(tableName);
}

三、总结

其他几个操作因为篇幅的原因笔者就不贴出来了,可以下载源码看下。其实函数的使用就是将函数参数解析出来,然后按照sql语法拼接起来,因为不管是sqlite还是sqlserver、mysql或者Oracle,最后都是sql语句在执行增删改查,所以可以学下sql语句,对于理解和封装这些函数有很大帮助。
源码下载链接:https://github.com/944414275/Sqlite

四、参考文献

4.1 https://blog.csdn.net/roujian0985/article/details/139107692?spm=1001.2014.3001.5501

4.2 https://www.runoob.com/sqlite/sqlite-create-table.html

  • 31
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值