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";//表存在
        }

    }

}

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值