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