sqlite操作总结(二)

来源:互联网 发布:windows pe是什么 编辑:程序博客网 时间:2024/06/05 21:49

sqlite除了可以读写基本的数据类型,还包括二进制类型,下面描述在sqlite中读写二进制数据的方法。

首先,在建表时,将这类数据的类型定义为BLOB:

CREATE TABLE IF NOT EXISTS T1 ("PersistentId TEXT NOT NULL PRIMARY KEY,  Items BLOB");

Items这个字段就是二进制类型的数据,当我们要加入一条数据时:

bool_t SqlStoreBlob(sqlite3* dbHandle, void* buffer, int buffLen,){    string SqlStatement = "INSERT INTO T1 VALUES ('TEST',?)";    int sqlResult;    char* sqlErrMsg = NULL;    sqlite3_stmt * stat;    sqlResult = sqlite3_prepare_v2(dbHandle, SqlStatement.c_str(), -1, &stat, 0);    if(sqlResult != SQLITE_OK)    {        sqlite3_finalize(stat);        return 0;    }    sqlite3_bind_blob(stat, 1, buffer, buffLen, NULL);    sqlResult = sqlite3_step(stat);    sqlite3_finalize(stat);    if(sqlResult != SQLITE_DONE)        return 0;    return 1;}

可以看到,sql语句里指定插入的二进制数据用?表示
sqlite3_prepare_v2函数将sql语句转换成一个prepared statement对象,即sqlite3_stmt类型,并且返回对象的指针,如果执行失败就调用sqlite3_finalize销毁该对象;

接下来利用sqlite3_bind_blob把数据二进制数据插入数据绑定到prepared statement对象;

最后再调用sqlite3_step函数,这一步才是真正地执行sql语句,注意该函数的返回值SQLITE_DONE表示执行成功

其实这里相当于把insert的操作细化,由用户执行,其他基础数据类型也是序列化后按照这个步骤存入数据库。

下面看一下从数据库获取二进制数据的方法:

bool_t SqlGetBlob(sqlite3* dbHandle, void** buffer, int& buffLen){    string SqlStatement = "SELECT (Items) FROM T1 WHERE PersistentId='TEXT';";    char* sqlErrMsg = NULL;    sqlite3_stmt * stat;    sqlResult = sqlite3_prepare_v2((sqlite3*)dbHandle, SqlStatement.c_str(), -1, &stat, 0 );    if(sqlResult != SQLITE_OK)    {        return 0;    }    sqlResult = sqlite3_step(stat);    if(sqlResult == SQLITE_ROW){        buffLen = sqlite3_column_bytes(stat, 0);        *buffer = malloc(buffLen);        if(!(*buffer))        {            return 0;        }        memcpy(*buffer, sqlite3_column_blob(stat, 0), buffLen);    }    sqlite3_finalize(stat);    return 1;}

同样先将sql语句转换为prepared statement对象,再通过sqlite3_column_bytes函数获取数据的大小,sqlite3_column_blob函数获取指向数据的指针。如果你的缓冲区足够大也可以直接通过sqlite3_column_blob获取数据。

sqlite3_column_类函数从执行sqlite3_step()得到的结果集的当前行中返回一个列。每次sqlite3_step得到一个结果集的列停下后,这个过程就可以被多次调用去查询这个行的各列的值。对列操作是有多个函数,均以sqlite3_column为前缀

sqlite3_column_bytes和sqlite3_column_blob函数的第二个参数都是指定这一行中的想要被返回的列的索引,在这里两个函数的执行结果分别只有一列(即最左边的一列),所以我们传入0,返回值分别就是缓冲区的大小和指向数据的指针。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 列车晚点影响下一趟车怎么办? 高铁晚点赶不上下班车怎么办 火车在半路坏了怎么办 做火车中途坏了怎么办 员工怀孕不上班保险怎么办 怀孕带孩子不能上班保险怎么办 怀孕了不想上班保险怎么办 高铁票没票了怎么办 购买动车票无座怎么办 个税工资多报怎么办 火车晚点耽误了转车怎么办 坐火车联系不上怎么办 号码被别人注册了12306怎么办 注册12306的号码换了怎么办 12306号码被注册了怎么办 12306身份证被注册了怎么办 12306被别人注册了怎么办 铁路1236注册名忘记了怎么办 12306手机被别人注册了怎么办 12306注册手机不用了怎么办 到站后火车票掉了怎么办 在手机上买了票怎么办 智行火车票抢不到票怎么办 高铁买票票丢了怎么办 异地恋房费太贵怎么办 高铁票车上丢了怎么办 取了高铁票丢了怎么办 高铁买了学生票没带学生证怎么办 买的学生票超过区间怎么办 买了超过区间的学生票怎么办 火车票大于学生票购买区间怎么办 买了学生票学生证丢了怎么办 取票学生证没带怎么办 学生卡的失磁怎么办 学生证没有充磁买不了学生票怎么办 买学生票不在优惠区间怎么办 火车票学生优惠次数用完怎么办 学生乘火车优惠磁卡丢了怎么办 磁卡锁的卡丢了怎么办 电梯磁卡扣丢了怎么办 买火车票手机号填错了怎么办