目录
由于近期做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");
}
-
运行结果