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