Qt5.13使用QSQLITE数据库

之前自己用Qt去连接MySQL始终失败,网上的办法我都试过了(花了我一天时间 ,如果哪位大侠解决了,麻烦留言),都没解决,Qt creator只有32位的(官方就没有提供windows 64位的),最新的Qt 5.13 自带mingw 64/32位和vs2017 64/32位编译器,最新的MySQL8.0安装应该是64位的。一直没解决,所以换用SQLITE数据库,用法都一样。
一直报错;
QMYSQL driver not loaded

在使用数据库之前,应注意添加:

QT += sql
一:QSQLITE直接集成在Qt里(应该好多都集成了SQLITE),现在介绍下SQLITE的一些优势。在嵌入式和小工程中是一个不错的选择。当然SQLITE也有自己的数据库可视化管理工具–SQLite Expert,有免费版的:http://www.sqliteexpert.com/download.html 如果你对自己用Qt创建的数据库有疑问,用这个软件查看也是很方便的。

在这里插入图片描述

轻型的数据库,设计目标是嵌入式
占用资源非常低,在嵌入式设备中,可能只需要几百K的内存就够了
支持数据库大小至2TB
SQLite虽然很小巧,但是支持绝大多数的SQL语句
二:如何使用?
1. 如果你没有指定生成数据库的路径,那么默认的位置在编译生成文件的根目录,如果你已经运行了,那么第二次运行时,创建表将会失败,因为表在第一次已经存在

2.1:创建数据库及连接

添加头文件: QSqlDatabase

   QSqlDatabase DB = QSqlDatabase::addDatabase("QSQLITE");
    qDebug()<<QSqlDatabase::drivers();				//显示你的Qt版本支持什么数据库
    qDebug()<<QCoreApplication::libraryPaths();		//库的依赖路径

Qt支持多种数据库,包括QDB2,QIBASE, QMYSQL,QOCI,QODBC, QPSQL, QSQLITE, QSQLITE2, QTDS。你想使用什么数据库,直接修改类型即可。你可以使用上面qDebug()输出相关信息。

DB.setDatabaseName("extrafeartue.db");

添加数据库的名字及路径,见上,我直接给的名字,所以默认路径在编译文件夹的根目录,当然你可以指定一个路径,如绝对路径,相对路径。
需要注意的是:第二次运行的时候可能出错,因为数据库已经存在了,你可以用下面方法解决

1. 最简单的方法,找到手动删除。
2. 在设计是使用DROP DELETE删除,那么在程序结束数据库就删掉了,这样好像不符合预期,程序结束把数据库删了?况且也是不是能让你想删就删的。
3. 加一个条件判断,存在就删除,不存在就创建
4. 创建表的时候获取系统时钟,以系统时钟命令,之后再弄一个脚本,删掉所有.db文件

这里就是设置主机名、端口号、用户名、密码等,QSQLITE不需要这些。

//    DB.setHostName("localhost");
//    DB.setPort(3306);
//    DB.setUserName("root");
//    DB.setPassword("123456");

打开数据库即可。

    if(!DB.open()){
        QMessageBox::warning(this, "错误", "打开数据库失败", QMessageBox::Ok, QMessageBox::NoButton);
        return ;
    }

2.2:数据库的操作与执行

添加头文件: QSqlQuery
这些基本的操作和你平时使用其他数据库是一样的。

2.2.1:创建表"CREATE TABLE faceDB(id int primary key, name varchar(20), feature TEXT",其中exec()执行结果是ture/false,TEXT是字符串(65535个字符,最大的)
query = QSqlQuery(DB);
//query.exec("SET NAMES 'Latin1'");                                                 //设置支持中文
//主键从1开始依次递增,name是图片名字,feature特征数组,由于比较大512个float,选择TEXT来存储(65535字符,够用了)
qDebug() << "创建表状态" << query.exec("CREATE TABLE faceDB(id int primary key, name varchar(20), feature TEXT)");
2.2.2:插入记录,这里分享是带变量的插入

插入格式:

INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );

1: 你自己预先知道将要插入的数据

query.exec("INSERT INTO faceDB VALUES(0, '00_00.jpg', 'string of feature');

1: 不知道将要插入什么数据
采用prepare方法,先将数据准备好,在依次绑定每个变量值,好像print哈!

    //将每次人脸数据相关信息写入数据库--下面是写入变量到数据库的一种方式
    query.prepare("INSERT INTO faceDB(id, name, feature) VALUES(:id, :name, :feature)");
    query.bindValue(":id", i+1);
    query.bindValue(":name", file_name);
    query.bindValue(":feature", featurArray);
    qDebug() << "插入表状态" << query.exec(); 

上面是一种典型的方式,其实有两种方式:

方式一: “冒号+参数名”
方式二: “占位符”
    query.prepare("INSERT INTO faceDB(id, name, feature) VALUES(?, ?, ?)");
    query.bindValue(0, i+1);
    query.bindValue(1, file_name);
    query.bindValue(2, featurArray);
    qDebug() << "插入表状态" << query.exec();

在举个例子

    query.prepare("UPDATE employee SET Name=?, Gender=?, Hight=? WHERE EmpNo=?");
    query.bindValue(0, "XXX");
    query.bindValue(1, ""男);
    query.bindValue(2, 1.75);
    query.bindValue(3, 1145);
    qDebug() << "插入表状态" << query.exec();
2.2.3:显示已经插入的项

方案一:在控制台中循环显示
首先选中,利用next()方法自动到表结尾,利用toxxx()显示

    query.exec("SELECT id, name, feature FROM faceDB");
    while (query.next()) {
        qDebug() << "faceDB(" << query.value(0).toInt()<<") name:" << query.value(1).toString()<<" feature:" << query.value(2).toString();
    }

方案二:SQLITE Export打开数据库
装好该软件,打开数据库即可查看
方案三:利用QSqlTableModel显示
用QSqlTableModel显示时,不可以修改表中元素

    //QSqlTableModel显示的视图只能显示,不可以修改
    QSqlTableModel* model = new QSqlTableModel(this, DB);
    model->setTable("faceDB");				//名字要和之前建立的一样哈
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);    //设置编辑策略
    if(!(model->select())){
        QMessageBox::critical(this, "错误", "打开数据表错误\n"
                              +model->lastError().text(), QMessageBox::Ok, QMessageBox::NoButton);
        return ;
    }
    ui->tableView->setModel(model);
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);  //设置视图为只读模式
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值