//本文在 QT6.2.4 MSVC2019调试成功。
//sqlite数据库的BLOB类型常常用来存数组,不同类型和长度的数组,需要转化为一个个字节。
//哪些数组呢,整型、浮点型、字符串都可以。图像的raw数据也是数组。
//那么QByteArray 正好可以。
//QByteArray可用于存储原始字节(包括‘\0’s)和传统的以8位‘\0’s结尾的字符串。使用QByteArray
//比使用const char *要方便得多。在幕后,它总是确保数据后面有一个“\0”终止符,并使用隐式共
//享(写时复制)来减少内存使用,避免不必要的数据复制。
//
#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
#include <QSqlDriver>
#include <QElapsedTimer>
static int func()
{// 初始化数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:"); // 使用内存数据库
bool ok = db.open();
if (!ok) {
qDebug() << "无法打开数据库";
return -1;
}
// 创建表格
QSqlQuery query;
ok = query.exec("CREATE TABLE binary_data (id INTEGER PRIMARY KEY, data BLOB)");
if (!ok) {
qDebug() << "创建表格失败";
return -2;
}
// 插入二进制数据
QByteArray binaryData /*= QByteArray::fromHex("1234")*/; // 示例二进制数据
for(int i=0;i<16000;i++)//循环
{
binaryData.append(97);//逐个添加字符'a'的ascii码
}
QString str=QString("insert into binary_data"
"("
"data"
")"
"values('%1')" )
.arg(binaryData);//
// for (int i=0;i<10000;i++)//10000次耗时539ms
ok = query.exec(str);//1次耗时2ms
if (!ok)
{
qDebug() << "插入数据失败";
return -3;
}
// 读取二进制数据
ok = query.exec("SELECT data FROM binary_data WHERE id = 1");
if (ok && query.next())
{
QByteArray retrievedData = query.value(0).toByteArray();
// qDebug() << "读取到的二进制数据:" << retrievedData.toHex();
} else
{
qDebug() << "读取数据失败";
return -4;
}
}
int main(int argc,char* argv[])
{
QCoreApplication a(argc, argv);
QElapsedTimer t;
t.start();
func();
qDebug()<<t.elapsed()<<"ms";
return a.exec();
}