精华内容
下载资源
问答
  • 2016-03-01 15:49:30

    1.写二进制数据
    sqlite3 * db;
    int result;
    char **errmsg =NULL;
    result = sqlite3_open(“test.db”, &db );
    if( result != SQLITE_OK )
    { return -1;}
    result = sqlite3_exec( db,”create table tb( ID integer, content blob)”, NULL, NULL, errmsg);
    if(result != SQLITE_OK){printf(“erro”);}

       char *buffer;//要写的二进内容,也可以从文件读出来
       buffer=new char[1024*1024];
       for(int i=0;i<1024*1024;i++)buffer[i]='a';
    

    sqlite3_stmt *stat;//写二进制数据时要用的结构
    sqlite3_prepare( db, “insert into tb( ID, content) values( 10, ? )”, -1, &stat, 0 );//准备插入数据
    sqlite3_bind_blob( stat, 1, buffer, strlen(buffer), NULL ); //把内容和字段绑定
    result=sqlite3_step( stat );//执行
    sqlite3_finalize( stat );释放内存
    sqlite3_close( db );

    2.读二进制数据
     这里重点介绍一下sqlite3_blob_open函数
    这个函数用于打开二进制字段数据
    第一个参数是数据库句柄
    第二个参数是数据库名
    第三个参数是表名
    第四个参数是二进制数据字段(列)名
    第五个参数是行数,也就是打开第几行的字段。
    第六个
    第七个参数是二进制文件句柄
    用这个函数打二进制字段就像打开文件一样简单。
    下面为例子代码:

    sqlite3 * db;
    int result;
    char **errmsg =NULL;
    result = sqlite3_open(“test.db”, &db );
    if( result != SQLITE_OK )
    { return -1;}
    int rf= sqlite3_blob_open(db,NULL,”Tbl_2”,”file_content”,1,1,&sqlite3_blob);

    if(rf!= SQLITE_OK)return –1;
    int len=sqlite3_blob_bytes(sqlite3_blob);//得到二进数据长度
    sqlite3_blob_read(sqlite3_blob,buffer,len,0); 读二进数据,最后一个参数为起始位置
    //如果不想读全部内容,可以设置这个参数
    sqlite3_blob_close(sqlite3_blob);//关闭
    sqlite3_close( db );
    3.几个问题
    a. sqlite3_blob_open函数第五个参数读第几行的数据,不知道通过什么函数能得到当前行的绝对行数,而sqlite3_total_changes函数只能得更改行的相对行数。
    b. sqlite3_blob_write函数是用于写二进制数据,但这个函数只能用于修改二进制数据,不能用于插入二进制数据,而写数据的时候长度不能超过第一次插入数据时的长度。

    1. sqlite3_blob_open 需要的rowid可以通过select rowid from [table] where [] 得到
    2. 需要修改blob的长度可以通过update语句进行修改 如:update tb set content=? where id=x
      然后 sqlite3_bind_zeroblob(stmt, 1, len); 第三个参数就是修改后的长度。bind_zeroblob可以用于几个G的数据写入。
      修改完大小后使用sqlite3_blob_open和sqlite3_blob_write写入数据,在sqlite3_blob_open之后你可以任意次调用sqlite3_blob_write写入数据,只要不超过sqlite3_bind_zeroblob中设定的长度就可以了。最后用sqlite3_blob_close关闭掉就可以了

    注:
    使用 select rowid from 获取rowid时,如果你的表结构有一个类型为integer的自增主键 那么返回的结果的column名称就是你的主键名称。

    更多相关内容
  • sqlite存储二进制数据

    2020-09-23 14:24:57
    {//存储二进制数据 unsigned char hex[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; sqlite3_prepare(pDB,"insert into bList values ('hex',?);",-1,&stmt,NULL); sqlite3_bind_blob(stmt,1,hex,16,NULL);...
     {//存储二进制数据
         unsigned char hex[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
         sqlite3_prepare(pDB,"insert into bList values ('hex',?);",-1,&stmt,NULL);
         sqlite3_bind_blob(stmt,1,hex,16,NULL);
         sqlite3_step(stmt);
     }
    
     stmt=NULL;
     {//存储exe文件
         memset(buffer,0,65535);
         {
             FILE* fp=fopen(argv[0],"rb");
             iLen=fread(buffer,1,65535,fp);
             fclose(fp);
         }
         sqlite3_prepare(pDB,"insert into bList values ('me.exe',?);",-1,&stmt,NULL);
         sqlite3_bind_blob(stmt,1,buffer,iLen,NULL);
         sqlite3_step(stmt);
     }
    
     stmt=NULL;
     {//存储普通c文档
         memset(buffer,0,65535);
         {
             FILE* fp=fopen("../main.c","rb");
             iLen=fread(buffer,1,65535,fp);
             fclose(fp);
         }
         sqlite3_prepare(pDB,"insert into bList values ('main.txt',?);",-1,&stmt,NULL);
         sqlite3_bind_blob(stmt,1,buffer,iLen,NULL);
         sqlite3_step(stmt);
     }
     stmt=NULL;
     {//从数据库中读取txt文件数据
         char *data=NULL;
         memset(buffer,0,65535);
         sqlite3_prepare(pDB, "select binData from bList where fileName='main.txt';", -1, &stmt, 0);
         sqlite3_step(stmt);
         data= (char *)sqlite3_column_blob(stmt,0);//得到纪录中的BLOB字段
         iLen= sqlite3_column_bytes(stmt, 0);//得到字段中数据的长度
         memmove(buffer,data,iLen);
         printf("%s\n",buffer);
     }
    
    展开全文
  • qt下使用sqlite数据库存储二进制文件

    千次阅读 2016-05-21 14:53:11
    qt下sqlite数据库存储和查询二进制数据

    qt支持小型数据库sqlite,并可存储二进制文件,类型为BLOB,可以将数据一次性存储,而不用频繁操作数据库。

    头文件:

    #include <QtSql/QSqlDatabase>

    #include <QtSql>

    库:

    Qt5Sqld.lib

    当然,如果要运行程序,还需要相应的dll库

    Qt5Sql.dll


    1、h文件

    #ifndef QMYSQL_H
    #define QMYSQL_H


    #include <QtSql/QSqlDatabase>
    #include <qtgui>
    #include <QtSql>

    #define DATETIME_FORMAT ("yyyy-MM-dd HH:mm:ss")


    // 数据库存储与查询类,ypchen,20160516
    class QMySql
    {
    private:
    QMySql();


    public:
    ~QMySql();
    static QMySql* self();
    bool AddAdData(QDateTime dt, QByteArray data);
    QMap<QString, QByteArray> QueryData();


    private:
    static QMySql* m_instance;// 单例
    QSqlDatabase m_db;// 数据库类
    };


    #endif // QMYSQL_H

    2、cpp文件

    QMySql* QMySql::m_instance = NULL;


    QMySql::QMySql()
    {
    m_db = QSqlDatabase::addDatabase("QSQLITE");
    m_db.setDatabaseName("curve.db");
    bool ret = m_db.open();
    qDebug() << "Open db:" << ret << m_db.lastError();
    QSqlQuery query;//以下执行相关QSL语句


    ret = query.exec("CREATE TABLE IF NOT EXIST Curve(\
    ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\
    TIME TEXT NOT NULL,\
    AD BLOB NOT NULL\
    );");


    qDebug() << "Create table:" << ret << m_db.lastError();
    }


    QMySql::~QMySql()
    {
    m_db.close();
    }


    // 单例
    QMySql* QMySql::self()
    {
    if (m_instance == NULL)
    {
    m_instance = new QMySql();
    }
    return m_instance;
    }


    // 保存ad值到数据库
    bool QMySql::AddAdData(QDateTime dt, QByteArray data)
    {
    QSqlQuery query(m_db);
    QString strDt = dt.toString(DATETIME_FORMAT);
    QString strSql = "INSERT INTO Curve (TIME,AD) VALUES (?,?)";
    query.prepare(strSql);
    query.bindValue(0, strDt);
    int size = data.size();
    query.bindValue(1, data, QSql::Binary);


    bool ret = query.exec();
    qDebug() << "Add data:" << ret << m_db.lastError();


    return ret;
    }


    // 查询数据库中的所有ad值
    QMap<QString, QByteArray> QMySql::QueryData()
    {
    QMap<QString, QByteArray> dbMap;
    QSqlQuery query(m_db);
    if (query.exec("SELECT * from Curve"))
    {
    while (query.next())
    {
    QString strDt;
    QByteArray data;
    strDt = query.value(1).toString();
    data = query.value(2).toByteArray();
    int len = data.size();
    dbMap[strDt] = data;
    }
    }
    qDebug() << "Query data:" << m_db.lastError();


    return dbMap;
    }



    展开全文
  • Qt存储二进制文件

    2021-10-19 22:31:41
    1. 存储基本类型 基本类型如int, double, char等,读写时按照其所占字节长度进行读写即可。要注意的是读写顺序一定要保持相同。如先写的int再写的double,那么读取时也必须按照这个顺序来依次读取。 write test....

     1. 存储基本类型

    基本类型如int, double, char等,读写时按照其所占字节长度进行读写即可。要注意的是读写顺序一定要保持相同。如先写的int再写的double,那么读取时也必须按照这个顺序来依次读取。

    write test.dat

    int aaa = 111;
    double bbb = 222.222;
    char ccc[4] = "ccc";
    
    QFile file("test.dat");
    if (file.open(QIODevice::WriteOnly | QIODevice::Truncate))
    {
    	file.write(reinterpret_cast<char *>(&aaa), sizeof(int));
    	file.write(reinterpret_cast<char *>(&bbb), sizeof(double));
    	file.write(reinterpret_cast<char *>(&ccc), 4);
    }
    file.close();

    read test.dat 

    int aaa;
    double bbb;
    char ccc[4];
    
    QFile file("test.dat");
    if(file.open(QIODevice::ReadOnly))
    {
    	file.read(reinterpret_cast<char *>(&aaa), sizeof(int));
    	file.read(reinterpret_cast<char *>(&bbb), sizeof(double));
    	file.read(reinterpret_cast<char *>(&ccc), 4);
    
    	qDebug() << "aaa: " << aaa << endl;
    	qDebug() << "bbb: " << bbb << endl;
    	qDebug() << "ccc: " << ccc << endl;
    }

     

     2. 存储结构体

    在用二进制文件保存配置信息/数据信息的情况下,自定义的结构体是最常见的数据结构,如

    struct ied_info_stru
    {
    	int ied_id;
    	char ied_name[128];
    	char ref[256];
    	int dev_type;
    	bool check_flag;
    	short check_result;
    	int sig_count;
    }

    write test.dat 

    QFile file("test.dat");
    if (file.open(QIODevice::WriteOnly | QIODevice::Truncate))
    {
    	ied_info_stru ied_info;
    	ied_info.ied_id = 2222;
    	memcpy(ied_info.ied_name, "test name", 128);
    	// 只给结构体里的两个信息赋了值,其他省略...
    
    	file.write(reinterpret_cast<char *>(&ied_info), sizeof(ied_info_stru));
    	file.close();
    }

     read test.dat 

    QFile file("test.dat");
    if(file.open(QIODevice::ReadOnly))
    {
    	ied_info_stru ied_info;
    	file.read(reinterpret_cast<char *>(&ied_info.ied_id), sizeof(int));
    	file.read(reinterpret_cast<char *>(&ied_info.ied_name), 128);
    
    	qDebug() << "ied_id: " << ied_info.ied_id << endl;
    	qDebug() << "ied_name: " << ied_info.ied_name << endl;
    }

     

    3. 存储嵌套结构体

    更复杂的情况是,结构体里套着结构体,如struct 1中套着个struct 2的list

    // struct 1
    struct ied_info_stru
    {
    	int ied_id;
    	char ied_name[128];
    	char ref[256];
    	int dev_type;
    	bool check_flag;
    	short check_result;
    	int sig_count;
    
        QList<sig_info_stru> sig_list;    // list of struct 2
    };
    
    // struct 2
    struct sig_info_stru
    {
    	int sig_id;
    	char sig_name[256];
    	char ref[256];
    	int sig_type;
    	int yx_value;
    	float yc_data;
    	float up_data;
    };

    要注意的是,由于结构体中新加入的QList<sig_info_stru> sig_list是一个list,即它的长度是未知的,所以这时候如果还是想用上一种方法,直接sizeof(ied_info_stru),这样计算出来的长度是错误的。

    write test.dat 

    QFile file("test.dat");
    if (file.open(QIODevice::WriteOnly | QIODevice::Truncate))
    {
    	ied_info_stru ied_info;
    	ied_info.ied_id = 2222;
    	memcpy(ied_info.ied_name, "test name", 128);
    
    	// 构造两个list
    	QList<sig_info_stru> ls_signals;
    	sig_info_stru sig_1;
    	memcpy(sig_1.sig_name, "sig1", 256);
    	ls_signals.push_back(sig_1);
    	sig_info_stru sig_2;
    	memcpy(sig_2.sig_name, "sig2", 256);
    	ls_signals.push_back(sig_2);
    	ied_info.sig_list = ls_signals;
    
    	// write to file
    	file.write(reinterpret_cast<char *>(&ied_info.ied_id), sizeof(int));
    	file.write(reinterpret_cast<char *>(&ied_info.ied_name), 128);
    	file.write(reinterpret_cast<char *>(&ied_info.ref), 256);
    	file.write(reinterpret_cast<char *>(&ied_info.dev_type), sizeof(int));
    	file.write(reinterpret_cast<char *>(&ied_info.check_flag), sizeof(bool));
    	file.write(reinterpret_cast<char *>(&ied_info.check_result), sizeof(short));
    	file.write(reinterpret_cast<char *>(&ied_info.sig_count), sizeof(int));
    
    	for(int i = 0; i < ied_info.sig_list.size(); i++)
    		file.write(reinterpret_cast<char *>(&ied_info.sig_list[i]), sizeof(sig_info_stru));
    	file.close();
    }

    read test.dat 

    QFile file("test.dat");
    if(file.open(QIODevice::ReadOnly))
    {
    	ied_info_stru ied_info;
    	file.read(reinterpret_cast<char *>(&ied_info.ied_id), sizeof(int));
    	file.read(reinterpret_cast<char *>(&ied_info.ied_name), 128);
    	file.read(reinterpret_cast<char *>(&ied_info.ref), 256);
    	file.read(reinterpret_cast<char *>(&ied_info.dev_type), sizeof(int));
    	file.read(reinterpret_cast<char *>(&ied_info.check_flag), sizeof(bool));
    	file.read(reinterpret_cast<char *>(&ied_info.check_result), sizeof(short));
    	file.read(reinterpret_cast<char *>(&ied_info.sig_count), sizeof(int));
    	qDebug() << "ied_id: " << ied_info.ied_id;
    	qDebug() << "ied_name: " << ied_info.ied_name;
    
        // 读存进去的两个list
    	sig_info_stru sig_info;
    	for(int i = 0; i < 2; i++)
    	{
    		file.read(reinterpret_cast<char *>(&sig_info), sizeof(sig_info_stru));
    		qDebug() << "sig name:" << sig_info.sig_name;
    	}
    }

    展开全文
  • 我们有这样一个需求:要保存二进制文件到数据库,以后还要从数据库读出来使用。到网上g了一下,发现可以实现,记录以备忘。# coding: utf8# Python2.6.2import sqlite3db = sqlite3.connect('test.db')cur = db....
  • 里面对于Sqlite3数据库2进制数据进行了详细的解析和对于大部分常用Sqlite3的接口函数做了一定的总结。对于2进制数据eg图片的操作有实例源代码提供。
  • sqlite3支持对二进制数据的缓存,在实际的编程开发当中我们经常要处理一些大容量二进制数据的存储,如图片、音乐、视频等等。对于这些二进制数据,我们不能像处理普通的文本那样,但是我们可以用blob来存储sqlite...
  • Qt中向SQLite读写二进制

    千次阅读 2019-07-25 09:46:26
    引言:面对工程问题,无不例外要和数据库打交道,除存储基本信息以外,还有大量的图片,计算结果,当然我们不能老实巴交的存进去,比如图片只存路径,人脸特征数组或网络字节数据都可以转成二进制方式存储。...
  • SQLite版本 sqlite> select version(); no such function: version sqlite> SELECT sqlite_version(); +------------------+ | sqlite_version() | +------------------+ | 3.21.0 | +------------------+ 1 ...
  • 摘要:Java源码,文件操作,读取文件,二进制 Java读存大块二进制资料文件,java.io 包中提供了BufferedInputStream 和BufferedOutputStream 类来缓存的读写流。但是读写大块的数据文件时,使用这两个类的效果并不是很...
  • WPF SQLite存储与读取二进制图片
  • 关于SQLite事务可以解决一些问题,比如你要插入两个数据,可以将两个数据作为同一个事务进行插入,这样如果第个数据错误了,便自动执行回滚操作,第一个数据也不会插入成功,保证了数据的同步。 2.举例 A...
  • 存储在数据库中的二进制文件如,word、excel、txt等读取出来,并保存,
  • 网络上找到的文档,共享下,期待高手改写成aardio的SQLite存取二进制数据/*程序功能: 使用SQLite的C API操作SQLite数据库,存取二进制数据.用来测试的文件都小于65535字节,没有测试更大的文件!*/#include #include...
  • Android问题—SQLite存储大二进制文件

    千次阅读 2017-04-03 17:08:12
    SQLite存储大二进制文件 当然,一般我们很少往数据库中存储大二进制文件,比如图片,音频,视频等,对于这些我们一般 是存储文件路径,但总会有些奇葩的需求,某天你突然想把这些文件存到数据库里,下面我们以 图片...
  • $file = 'abcd.sqlite';mysql_connect('localhost','root','123456');mysql_select_db('zblog');mysql_query('set names utf8');/*$backup_stream = file_get_contents($file);// var_dump($backup_stream);exit;// ...
  • SQLite存取二进制数据

    千次阅读 2013-05-21 15:20:52
    程序功能: 使用SQLite的C API操作SQLite数据库,存取二进制数据.  用来测试的文件都小于65535字节,没有测试更大的文件! 参考文档: http://www.cntxk.com/CataNews/56/info8106.html 编译环境: codeblock ...
  • 博主尝试用Python的sqlite3数据库存放加密后的用户名密码信息,表是这样的CREATE TABLE IF NOT EXISTS user ( userID INTEGER PRIMARY KEY AUTOINCREMENT, userStudentID BLOB NOT NULL UNIQUE ON CONFLICT...
  • Sqlite3 操作二进制数据

    千次阅读 2013-06-20 11:35:13
    SQLite存取二进制数据 一.使用流程 要使用sqlite,需要从sqlite官网下载到三个文件,分别为sqlite3.lib,sqlite3.dll,sqlite3.h,然后再在自己的工程中配置好头文件和库文件,同时将dll文件放到当前目录下,...
  • 该基本测试案列使用的是:springboot、...主要测试的是向数据中写入如.pdf、.yml、.jpg、.mp3等等类型的二进制文件,当然,像字符串这种编码固定的也是可以写入的,不是说数据库中Blob类型的字段不能写入字符串。
  • memcache作为一个数据中间层,...Key state#ID 如”state#10888”Value : (二进制的数据 )用户 ID Uint32Type 用户类型 Uint8 :State 用户状态 Uint8 :服务器 IP Uint32最后在线时间 Uint64Session ID的长度 Ui...
  • 此文用于总结在Android开发中,各种二进制文件,如音乐,视频,图片等的各种操作。学识浅薄,不会一次性地把所有内容全部写出来,以后会陆陆续续地更新。 1、图片 1、将图片存入SQLite数据库 将图片存入SQLite数据,...
  • Android 在SQLite中存取二进制图片

    千次阅读 2018-06-28 21:39:03
    想在SQLite中存图片,有两种方式,一种是存图片所在路径,一种就是存二进制文件,在SQLite中存二进制图片选择BLOB类型 存储 private void saveImageToDb(SQLiteDatabase db, Bitmap bitmap, String id) { ...
  • python处理ECG二进制文件(.dat文件)和.db文件
  • “ Karta”是IDA的python插件,其功能是在已经编译过的二进制文件中搜索是否使用了开源的代码。该插件是为了匹配大体积二进制文件中的开放源代码库的开源代码(通常是查找固件)。对于每天处理固件的人来说,反复的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,989
精华内容 7,195
关键字:

sqlite存储二进制文件