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

前言

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

开发示例

此demo仅供学习使用。

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;

测试结果



总结

经过这一个月工作之余的优化,终于把项目的缓存给做好了,其中也遇到了很多问题,例如sqlite的编码转换,图片缓存速度慢,还有db-journal文件操作慢,以及如何直观的让sqliteDb大小自动展现,自己也是查了官方英文文档才一步步解决各种坑。总结的好处就在于能够温故知新。

sqlite3的图片的(二进制数据)存取操作的更多相关文章

  1. HTML5新特性之文件和二进制数据的操作 Blob对象

    HTML5新特性之文件和二进制数据的操作 1.Blob对象 2.FileList对象 3.File对象 4.FileReader 对象 5.URL对象

  2. BLOB存储图片文件二进制数据是非对错

    子在一天一天虚度,生活也在一天一天中茫然 做人做事哪能尽如人意,付出多少收获多少虽然存在偏颇,但是不劳而获的心态是万万不对的,更不能去怨天尤人,低调为人.做好自己就可以了 改进你的系统的最好的方法是先 ...

  3. HTML5新特性之文件和二进制数据的操作

    历史上,JavaScript无法处理二进制数据.如果一定要处理的话,只能使用charCodeAt()方法,一个个字节地从文字编码转成二进制数据,还有一种办法是将二进制数据转成Base64编码,再进行处 ...

  4. 关于Python获取图片文件二进制数据的问题(获取为空)

    在搭建fastdfs文件系统的时候遇到了点问题,在测试上传文件数据流的时候,需要Python来获取本地文件的二进制流 from fdfs_client.client import Fdfs_clien ...

  5. opencv学习笔记——FileStorage类的数据存取操作

    OpenCV的许多应用都需要使用数据的存储于读取,例如经过3D校准后的相机,需要存储校准结果矩阵,以方便下次调用该数据:基于机器学习的应用,同样需要将学习得到的参数保存等.OpenCV通过XML/YA ...

  6. Sword redis存取二进制数据

    #include "hiredis/hiredis.h" /* redis头文件 */ #include <stdio.h> #include <stdlib.h ...

  7. 讨论贴:Sqlserver varbinary 是二进制数据,却是十六进制的表现形式

    首先创建一个数据表 CREATE TABLE [dbo].[log_info]( [id] [,) NOT NULL, [info] [varchar]() NULL, [info1] [varbin ...

  8. 转载:【原译】Erlang构建和匹配二进制数据(Efficiency Guide)

    转自:http://www.cnblogs.com/futuredo/archive/2012/10/19/2727204.html Constructing and matching binarie ...

  9. 用string存取二进制数据

    STL的string很强大,用起来也感觉很舒服,这段时间在代码中涉及到了用string存取二进制数据的问题,这里记录一下,以供以后参考. 首先提一下STL中string的参考资料:http://www ...

随机推荐

  1. MVC5 网站开发之七 用户功能 1、角色的后台管理

    角色是网站中都有的一个功能,用来区分用户的类型.划分用户的权限,这次实现角色列表浏览.角色添加.角色修改和角色删除. 目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 ...

  2. php跳转页面

    1.header(location:'url'); header函数前面不能有输出 ! 可以先输出到缓存. 2js echo "<script language='javascript ...

  3. userdel 连同家目录一起删除

    userdel -r xxx 连同家目录一起删除

  4. 【C-01关键字】

    一.语句引导关键字 for   while   swith  if  do   goto   return 二.限定关键字 const  static   extern 三.预编译关键字 #inclu ...

  5. JavaScript学习笔记——对象基础

    javascript对象基础 一.名词解释: 1.基于对象 一切皆对象,以对象的概念来编程. 2.面向对象编程(oop Object oriented programming) A.对象 就是人们要研 ...

  6. Qt 5.4 OpenCV 2.4.11 Win 32 Configuration

    Download CMake 2.8.2 Download OpenCV 2.4.11 Download Qt 5.4 Highly improtant note: The installation ...

  7. Fiddler手机抓包工具如何设置过滤域名?

    fiddler手机抓包工具如何设置过滤域名?如题.fiddler抓包可以完成我们移动开发者的调试测试需求.所以说抓包尤其重要,但是多余的网页请求和手机的其他链接影响我们手机开发的需求.下面我教大家怎么 ...

  8. IOS学习笔记38--@class #import辨析 #include

    tyle="margin:20px 0px 0px; line-height:26px; font-family:Arial"> #include         区分 #i ...

  9. cogs 53 多人背包

    /* 要求每个最优 即累加前k优解 注意不用去重 */ #include<iostream> #include<cstdio> #include<cstring> ...

  10. Extjs视频

    Extjs视频http://www.youku.com/playlist_show/id_19343298.html ExtJs视频教程(关东升) 智捷关东升老师ExtJs视频教程AJAX框架-Ext ...