//本文在 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();
}

04-19 09:16