目錄
由於近期做Linux的項目涉及到字節流的數據庫存儲和讀取的sqlite3與C語言的相關函數API,自己就做了這個相關的總結,至於一些基本的sqlite3的API我的這篇博客會有介紹,大家有不明白的可以參考一下。
鏈接:https://blog.csdn.net/qq_44045338/article/details/105500637
-
blob類型簡介
BLOB (binary large object)即二進制大對象,是一種可以存儲二進制文件的容器。在計算機中,BLOB常常是數據庫中用來存儲二進制文件的字段類型。常見的BLOB文件有圖片、聲音和自定義對象等。
-
準備SQL語句
int sqlite3_prepare( sqlite3 *db, /* Database handle */ const char *zSql, /* SQL statement, UTF-8 encoded */ int nByte, /* Maximum length of zSql in bytes. */ sqlite3_stmt **ppStmt, /* OUT: Statement handle */ const char **pzTail /* OUT: Pointer to unused portion of zSql */ );
參數介紹:
sqlite3 *db 數據庫操作句柄,由sqlite3_open()函數可以得到;
const char *zSql QL語句可以使用snprintf函數打印到某個具體的sql_buf以供自己使用;
int nByte sql語句的長度;
sqlite3_stmt **ppstmt 編譯好的準備語句指針,該指針可以由sqlite3_step()執行;如果函數發生錯誤,該指針爲NULL;
const char **pzTail 當生成的指定語句超過nByte指定的長度時,剩餘的語句存放位置。建議zSql和nByte設置足夠長,這樣該參數就可以直接置爲NULL;
返回值 函數執行成功時,返回SQLITE_OK;否則返回錯誤碼。 -
BLOB綁定函數
int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
參數介紹:
sqlite3_stmt* 準備語句指針,該指針有sqlite3_prepare()函數得到
int 要綁定的BLOB下標,從1開始
const void* BLOB數據的指針
int n BLOB數據長度
void()(void) 析構回調函數,一般默認爲空
返回值 函數執行成功時,返回SQLITE_OK;否則返回錯誤碼 -
準備語句執行函數
int sqlite3_step(sqlite3_stmt*);
參數介紹
sqlite3_stmt* 準備語句指針,該指針有sqlite3_prepare()函數得到
返回值 函數執行成功時,返回SQLITE_OK;否則返回錯誤碼 -
銷燬準備語句函數
int sqlite3_finalize(sqlite3_stmt *pstmt);
參數介紹
sqlite3_stmt* 準備語句指針,該指針有sqlite3_prepare()函數得到
返回值 函數執行成功時,返回SQLITE_OK;否則返回錯誤碼 -
獲取指定字段的整形數據值
int sqlite3_column_int(sqlite3_stmt*, int iCol);
參數介紹
sqlite3_stmt* 準備語句指針,該指針有sqlite3_prepare()函數得到
int iCol 列的編號,從0開始
返回值 函數執行成功時,返回SQLITE_OK;否則返回錯誤碼 -
獲取指定字段的BLOB值
const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
參數介紹
sqlite3_stmt* 準備語句指針,該指針有sqlite3_prepare()函數得到
int iCol 列的編號,從0開始
返回值const void * BLOB數據指針 -
獲取指定BLOB數據長度
int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
參數介紹
sqlite3_stmt* 準備語句指針,該指針有sqlite3_prepare()函數得到
int iCol BLOB下標,從1開始
返回值 int BLOB數據長度
-
編程示例
注 測試平臺:Ubuntu 14.04
測試語言 : C語言
#include <stdio.h>
#include <string.h>
#include "sqlite3.h"
#include "main.h"
int main (int argc, char *argv[])
{
sqlite3 *db;
char sql_insert[64] = {0};
char buf[64]= {0xfd,0x02,0x06,0x50,0xcb,0xdc,0xfd};
db = sqlite_create(db);
dump_buf(buf, 7);
memset(sql_insert, 0, 64);
snprintf(sql_insert, 64, "insert into temp values(12,?);");
sqlite3_stmt *stmt = NULL;
puts("before insert dum data is :");
dump_buf(buf, 7);
sqlite3_prepare(db, sql_insert, strlen(sql_insert),&stmt,0);
{
sqlite3_bind_blob(stmt, 1, &buf, 7,NULL);
sqlite3_step(stmt);
}
sqlite3_finalize(stmt);
char sql[128] = {};
snprintf(sql, 128, "select tlv_data from temp where id = 12");
if (sqlite3_exec(db, sql, callback, NULL, NULL)!= SQLITE_OK)
{
printf("Read data from table error:%s\n", sqlite3_errmsg(db));
return -1;
}
else
{
printf("Query data from table success.\n");
}
return 0;
}
int callback(void* para, int f_num, char ** f_value,char** f_name)
{
puts("read data from db :");
dump_buf(*f_value, 7);
return 0;
}
void dump_buf(char *data, int len)
{
int i = 0;
for (i = 0; i< len; i++)
{
printf("0x%02x ", (unsigned char)data[i]);
}
printf("\n");
}
-
運行結果