前言
在实际项目中遇到了图片数组存贮的问题,最后用blob将图片数组存下来,下面介绍一下简单方法。
开发示例
sqlite3支持对二进制数据的缓存,在实际的编程开发当中我们经常要处理一些大容量二进制数据的存储,如图片、音乐、视频等等。对于这些二进制数据,我们不能像处理普通的文本那样,但是我们可以用blob来存储。sqlite官方文档对blob 字段的解释是
BLOB. The value is a blob of data, stored exactly as it was input。
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;
转载博客链接:sqlite3的图片的(二进制数据)存取操作