sqlite3的图片的(二进制数据)存取操作

sqlite3的二进制存取操作

前言

上篇介绍了sqlite3的一些常用插入操作方法和注意事项,在实际项目中遇到了图片缓存的问题,由于服务器不是很稳定,且受到外界环境的干扰(例如断电,图片存储挂掉),一个数据结构中除了普通字段(int string),还包括图片数据,所以还需要将图片数据进行缓存,图片缓存与普通的数据库字段值缓存有所不同,下面介绍一下简单方法。

sqlite3支持对二进制数据的缓存,在实际的编程开发当中我们经常要处理一些大容量二进制数据的存储,如图片、音乐、视频等等。对于这些二进制数据,我们不能像处理普通的文本那样,但是我们可以用blob来存储。sqlite官方文档https://www.sqlite.org/datatype3.html#section_1blob 字段的解释是

BLOB. The value is a blob of data, stored exactly as it was input。

即数据不做任何转换,以输入形式存储。因此 BOLB通常用来存储二进制大对象。

sqlite3_bind_blob示例代码

char* cmdCreatBlobTable = "create table SqliteBlobTest (id integer , pic blob);  //首先创建一个可插入blob类型的表 。
    sqlite3* db = NULL;
    char * errorMessage = NULL;
    int iResult = sqlite3_open("SqliteTest.db", &db);
    sqlite3_exec(db,"drop table if exists SqliteBlobTest",0,0,0);  

    iResult = sqlite3_exec(db, cmdCreatBlobTable, NULL, NULL, &errorMessage);
    if (SQLITE_OK != iResult)
    {
        cout<<"创建表SqliteBlobTest失败"<<endl;
        break;
    }

    sqlite3_stmt *stmt;                                            //声明
    const char* sql = "insert into SqliteBlobTest values(1,?)";  
    char* pPicData = "this is a pic data" ;
    sqlite3_prepare(db,sql,strlen(sql),&stmt,0);                   //完成对sql语句的解析

    {  
        sqlite3_bind_blob(stmt,1,pPicData, strlen(pPicData), NULL);//1代表第一个?
        sqlite3_step(stmt);                                        //将数据写入数据库中
    } 

    sqlite3_prepare(db, "select * from SqliteBlobTest", -1, &stmt, 0);

    int result = sqlite3_step(stmt);
    int id = 0,len = 0; 
    char picData[128] = {0}; 
    if (result == SQLITE_ROW)                                     //查询成功返回的是SQLITE_ROW
    {
        cout<<"read success from sqlite"<<endl;
        id = sqlite3_column_int(stmt, 0);                         //从0开始计算,id为0,picdata 为1;
        const void * pReadPicData = sqlite3_column_blob(stmt, 1); //读取数据,返回一个指针
        len = sqlite3_column_bytes(stmt, 1);                      //返回数据大小
        memcpy(picData, pReadPicData, len);                       //把数据拷贝出来
    }
    else
    {
        cout<<"read fail from sqlite"<<endl;
    }
    sqlite3_finalize(stmt);                                      //把刚才分配的内容析构掉
    cout<<id<<" "<<picData<<endl;

测试结果

这里写图片描述
这里写图片描述

2016/6/11 15:07:22

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值