Qt中向SQLite读写二进制

4 篇文章 0 订阅

引言:面对工程问题,无不例外要和数据库打交道,除存储基本信息以外,还有大量的图片,计算结果,当然我们不能老实巴交的存进去,比如图片只存路径,人脸特征数组或网络字节数据都可以转成二进制方式存储。既节省空间,有可以提高效率。

下面是Qt中float数组(int、double)与QByteArray二进制之间的无损转换,准备工作:
https://blog.csdn.net/weixin_39956356/article/details/97147446
下面是SQLite中一些基本用法。
https://blog.csdn.net/weixin_39956356/article/details/96994534

1 顺便提下Qt中使用数据库的一些语法

1.1 判断表是否存在,存在就显示,不存在就创建

下面是我经常用到的一个模板,还可以吧。
1 使用contains(“表名”)判断是否已经存在该表。
2 这里提一下数据库数据类型中的二进制–BLOB
对于存储不同长度的二进制有好几种BLOB–BIT(64字节)、TINYBLOB(255字节)、BLOB(2^16-1
字节)、MEDIUMBLOB(2^24 -1字节)、LONGBLOB(2^32-1字节)

下面是我借用其他博主的图片,我最后给出链接。
在这里插入图片描述

    //选择数据库类型并连接
    DB = QSqlDatabase::addDatabase("QSQLITE");
    DB.setDatabaseName("extrafeartue.db");
    //打开数据库
    if(!DB.open()){
        QMessageBox::warning(this, "错误", "打开数据库失败", QMessageBox::Ok, QMessageBox::NoButton);
        return ;
    }
    //判断表是否存在,存在就显示,不存在就创建
    if(DB.tables().contains("faceDB")){
        showTable();
    }else {
        qDebug() << "创建表状态" << query.exec("CREATE TABLE faceDB(id int primary key, name varchar(20), feature BLOB)");
    }

1.2 转格式后存二进制到表中

float val[512] = {“数据是你提前获取的,自己测试10位小数都没有问题”};
QByteArray array;
array.clear();												 //相当于清零,习惯吧
int len_feature = sizeof(feature);             				 //4*512=2048,Qt的float是4字节
memcpy(array.data(), &val, static_cast<size_t>(len_feature));
//将每次人脸数据相关信息写入数据库--下面是写入变量到数据库的一种方式
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", array);
qDebug() << "插入表状态" << query.exec();      

1.3 从数据库中取二进制

QSqlRecord类

1 首先获取记录record(),这里讲下record()带参数和不带参数的区别。
1.1 不带参数的record(),下面就是。返回的是”只有字段定义,没有数据“,用于获取一个表的字段定义,大概就是第一行。表头
1.2 带参数record(int row),返回行号row的记录,包括字段定义和数据。
2 indexOf(“feature”) 返回字段是feature的序号。不存在返回-1
field(“feature”)返回字段是feature的对象。
value(“feature”)返回字段是feature的值。
count()返回字段的个数
contains(“feature”)表中是否包含feature字段
clear()清除所有字段定义和数据
isNull(“feature”)、setNull(“feature”)就很好理解了,判断是否为空,置空。
3 toByteArray转换成二进制

float cov[512] = {0.0};		//定义就初始化
QSqlRecord myrecord =  query.record();		//获取记录
QByteArray binaryData = query.value(myrecord.indexOf("feature")).toByteArray();		//取feature字段并弄成binaryData类型
memcpy(&cov, binaryData.data(), static_cast<size_t>(sizeof(cov)));

参考文章:
https://blog.csdn.net/qq_44947859/article/details/89431791

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值