sqlite3二进制文件操作

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名称就是你的主键名称。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值