sqlite 二进制字段 (zz)
有時我們用數(shù)據(jù)庫存儲文件,需要用到二進制字段,下面列常用方法。
?? 1.寫二進制數(shù)據(jù)
???? 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;//要寫的二進內(nèi)容,也可以從文件讀出來
?????? buffer=new char[1024*1024];
?????? for(int i=0;i<1024*1024;i++)buffer[i]='a';
?
sqlite3_stmt? *stat;//寫二進制數(shù)據(jù)時要用的結(jié)構(gòu)
?????? sqlite3_prepare( db, "insert into tb( ID,? content) values( 10, ? )", -1, &stat, 0 );//準備插入數(shù)據(jù)
?????? sqlite3_bind_blob( stat, 1, buffer, strlen(buffer), NULL ); //把內(nèi)容和字段綁定
?????? result=sqlite3_step( stat );//執(zhí)行
?????? sqlite3_finalize( stat );釋放內(nèi)存
sqlite3_close( db );
?
2.讀二進制數(shù)據(jù)
這里重點介紹一下sqlite3_blob_open函數(shù)
這個函數(shù)用于打開二進制字段數(shù)據(jù)
第一個參數(shù)是數(shù)據(jù)庫句柄
第二個參數(shù)是數(shù)據(jù)庫名
第三個參數(shù)是表名
第四個參數(shù)是二進制數(shù)據(jù)字段(列)名
第五個參數(shù)是行數(shù),也就是打開第幾行的字段。
第六個
第七個參數(shù)是二進制文件句柄
用這個函數(shù)打二進制字段就像打開文件一樣簡單。
下面為例子代碼:
?
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);//得到二進數(shù)據(jù)長度
sqlite3_blob_read(sqlite3_blob,buffer,len,0); 讀二進數(shù)據(jù),最后一個參數(shù)為起始位置
//如果不想讀全部內(nèi)容,可以設置這個參數(shù)
?????? sqlite3_blob_close(sqlite3_blob);//關閉
sqlite3_close( db );
?? 3.幾個問題
a.?????? sqlite3_blob_open函數(shù)第五個參數(shù)讀第幾行的數(shù)據(jù),不知道通過什么函數(shù)能得到當前行的絕對行數(shù),而sqlite3_total_changes函數(shù)只能得更改行的相對行數(shù)。
b.?????? sqlite3_blob_write函數(shù)是用于寫二進制數(shù)據(jù),但這個函數(shù)只能用于修改二進制數(shù)據(jù),不能用于插入二進制數(shù)據(jù),而寫數(shù)據(jù)的時候長度不能超過第一次插入數(shù)據(jù)時的長度。
我希望存儲的單個二進數(shù)據(jù)字段可能有幾個G的容量,而且隨時有可能修改,長度會不斷變化,用sqlite3_stmt顯然是不行的,而 sqlite3_blob_write函數(shù)又不能改變二進數(shù)據(jù)字段的長度,是我對Sqlite了解的不多,還是這個數(shù)據(jù)庫本身就有這個限制 ,希望高手能夠指點。
?
《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的sqlite 二进制字段 (zz)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【自用】nginx.conf
- 下一篇: 【VMware虚拟化解决方案】VMwar