IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> QT5中使用SQLite3相关知识 -> 正文阅读

[大数据]QT5中使用SQLite3相关知识

QT5中使用SQLite3相关知识

QT5中是通过QT提供的类QSqlDatabase和QSqlQuery来操作数据库SQLite3的,QSqlDatabase类主要负责建立数据库连接,QSqlQuery类主要负责具体操作数据库,比如增删改查等等这些,具体如下:
(温馨提示:Qt工程所在路径最好不要有中文字符、.pro工程文件记得添加sql支持)
在这里插入图片描述

1、QSqlDatabase类的使用——连接数据库

	//连接数据库
    QSqlDatabase db;
    if(QSqlDatabase::contains("qt_sql_default_connection"))  //查看是否存在默认连接
    {
        db = QSqlDatabase::database("qt_sql_default_connection"); //存在
        qDebug() << "default connection";
    }
    else
    {
        db = QSqlDatabase::addDatabase("QSQLITE");  //不存在
        qDebug() << "don't exists default connection";
    }
    
//  db.setDatabaseName("D:/Qt/Qtproject/sqlitebase/my.db");
    db.setDatabaseName("D:\\Qt\\Qtproject\\sqlitebase\\my.db");
//  db.setDatabaseName("my.db");

    if( ! db.open())
    {
        qDebug() << db.lastError().text();  //失败时输出错误信息
    }
    qDebug() << "open success";
db.setDatabaseName("D:/Qt/Qtproject/sqlitebase/my.db"); 
db.setDatabaseName("D:\\Qt\\Qtproject\\sqlitebase\\my.db");

上述2种方式都可以操作已经存在的my.db数据库文件,最好使用绝对路径,相对路径我没试过,第二种为什么要" \ \" 具体我也咩研究过,猜测估计是因为转义字符这些,这样操作的好处是数据库文件我们可以单独处理,比如Windows下我们可以用一些可视化软件操作数据库会更加方便;eg:SQLiteStudio等等
然后将准备好的数据库文件拷贝到需要的地方,因为SQLite数据库是以文件的形式保存的,十分简洁,因此嵌入式领域常选择它。

db.setDatabaseName("my.db");

该方法会在程序编译后自动生成一个my.db数据库文件,具体存放路径就是对应的工程build-Desktop_Qtversion_-----_Debug文件夹下。这种方式创建的数据库如果不在Qt中操作,默认是个空的数据库。
那么这时我们就可以通过QSqlQuery类在Qt中创建我们自己所需要的表格等相关结构数据:

2、QSqlQuery类的使用——具体操作数据库

具体方法就是通过QSqlQuery类的exec方法来执行SQL语句
这里我也遇到过一个问题,就是在QT中使用数据库,需要向数据库里插入数据时,如果多次运行qt程序,每次运行都会不向数据库里掺入数据,这显然不是我们想要的结果,那么有没有一种方法就只在第一次运行qt程序时一次性完成向数据库掺入数据,供程序后面使用,后面运行也就不再掺入数据。想了半天,最后终于找到了一个解决的办法(仅供参考)
举个例子,我们要向刚刚创建的数据库中,创建表格并掺入几条数据:
第一次操作数据的时候做一个判断,如果不存在对应的表格,就完成表格的创建并掺入数据,如果存在对应的表格就不掺入数据,另做其他处理(自定义)那么第二次运行时判断到表格存在,就不会再掺入数据了,具体实现如下:

void sqlite_init()
{
    //连接数据库
    QSqlDatabase db;
    if(QSqlDatabase::contains("qt_sql_default_connection"))  //查看是否存在默认连接
    {
        db = QSqlDatabase::database("qt_sql_default_connection"); //存在
        qDebug() << "default connection";
    }
    else
    {
        db = QSqlDatabase::addDatabase("QSQLITE");  //不存在
        qDebug() << "don't exists default connection";
    }
    
    db.setDatabaseName("my.db"); //以这种方式

    if( ! db.open())
    {
        qDebug() << db.lastError().text();  //失败时输出错误信息
    }
    qDebug() << "open success";
    
    QSqlQuery query;  //定义一个对象操作连接的数据库

    //查询数据库里是否有相关表的存在
    query.exec("select count(*) from sqlite_master where type='table' and name='market'");
    if(query.next())
    {
        if(query.value(0).toInt()==0)//程序第1次执行时会进入这里
        {
            qDebug() << "table market doesn't exit"; //表不存在
             /* 创建表 */
            if(!query.exec("create table if not exists market(blockname varchar,lineX int,colY int)"))
            {
                qDebug() << query.lastError().text();
            }         
            qDebug() << "create table market success";
            /*掺入数据*/
            query.exec("insert into market values('蔬菜水果类',100,0)");
            query.exec("insert into market values('食品零食类',250,0)");
            
            qDebug() << "insert market table success";
        }
        else  //程序第二次执行时会进入这里
        {
            qDebug() <<  "table market exits";//表存在
        }
    }

    //查询数据库里是否有相关表的存在
    query.exec("select count(*) from sqlite_master where type='table' and name='salegoods'");
    if(query.next())
    {
        if(query.value(0).toInt()==0) //程序第1次执行时会进入这里
        {
            qDebug() << "table salegoods doesn't exit"; //表不存在
             /* 创建表 */
            query.exec("create table if not exists salegoods(goodsname varchar,blockname varchar,nowprice float,oldprice float)");
            qDebug() << "create table salegoods success";
            /*掺入数据*/
            query.exec("insert into salegoods values('商品1','蔬菜水果类',4.8,5.8)");
            query.exec("insert into salegoods values('商品2','食品零食类',12,20)");
            
            qDebug() << "insert salegoods table success";
        }
        else //程序第2次执行时会进入这里
        {
            qDebug() <<  "table salegoods exits";//表存在
        }

    }

}

第一次编译运行结果:
在这里插入图片描述
第二次运行结果:
在这里插入图片描述
最后的数据库文件数据:
在这里插入图片描述
在这里插入图片描述

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:25:14  更:2022-05-05 11:27:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:10:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码