sqlite3数据库之blob数据类型读写

sqlite3数据库之blob数据类型读写sqlite3 数据库之 blob 数据类型读写近期在开发过程中需要在数据库中保存二进制文件 于是去了解了一下 sqlite3 的数据类型 发现 blob 可以存储二进制数据 但是 blob 要如何操作呢 用什么语句呢 其实它是需要操作 sqlite3 库的一些底层 API 来实现 下面我们就来做实验 先上测试代码 include Wdebug h include sqlite Wsqlite h include stdlib h define TABLE NAME TEST BL stdlib h

sqlite3数据库之blob数据类型读写

#include "Wdebug.h" #include "sqlite/Wsqlite.h" #include 
  
    #define TABLE_NAME "TEST_BLOB" typedef struct { TUint16 len; void* pdata; } TBlobData; void PrintList (TBlobData data) { if (data.pdata) { TUint8* pvalue = (TUint8*)data.pdata; printf ("len(%d):", data.len); for (int i = 0; i < data.len; i++) { printf ("%d ", pvalue[i]); } printf ("\n"); } else { printf ("data is NULL!\n"); } } int main (int argc, char* argv[]) { TBlobData data; struct TsqlCtrl* This = CreateSqlCtrl("database.db"); if (This) { TsqlCtrlDelTable (This, TABLE_NAME); if (TsqlCtrlExec(This, "CREATE TABLE "TABLE_NAME" (" "id INTEGER PRIMARY KEY" ",NAME TEXT NOT NULL" ",age INTEGER" ",address TEXT" ",Data1 BLOB" ");" , NULL, NULL) != WSQLITE_TRUE) { Werr ("创建表失败!"); } TsqlCtrlExec (This, "INSERT INTO "TABLE_NAME" (id, NAME, age, address) VALUES (NULL, '张三', 19, '北京')", NULL, NULL); TsqlCtrlExec (This, "INSERT INTO "TABLE_NAME" (id, NAME, age, address) VALUES (NULL, '李四', 7, '上海')" , NULL, NULL); TsqlCtrlExec (This, "INSERT INTO "TABLE_NAME" (id, NAME, age, address) VALUES (NULL, '刘五', 39, '广州')", NULL, NULL); TUint8 value[10]; for (int i = 0; i < sizeof (value); i++) { value[i] = i + 1; } TsqlCtrlWriteBlob (This, "UPDATE "TABLE_NAME" SET Data1=? WHERE NAME='张三'", value, sizeof (value), 1); for (int i = 0; i < sizeof (value); i++) { value[i] = i + 5; } TsqlCtrlWriteBlob (This, "UPDATE "TABLE_NAME" SET Data1=? WHERE NAME='李四'", value, sizeof (value) - 3, 1); for (int i = 0; i < sizeof (value); i++) { value[i] = i + 20; } TsqlCtrlWriteBlob (This, "INSERT INTO "TABLE_NAME" (id, NAME, age, address, Data1) VALUES (NULL, '老六', 24, '深圳', ?)", value, sizeof (value), 1); data = TsqlCtrlReadBlob (This, "SELECT Data1 FROM "TABLE_NAME" WHERE NAME='张三'", 0, value, sizeof (value)); PrintList (data); data = TsqlCtrlReadBlob (This, "SELECT Data1 FROM "TABLE_NAME" WHERE NAME='李四'", 0, value, sizeof (value)); PrintList (data); data = TsqlCtrlReadBlob (This, "SELECT id FROM "TABLE_NAME" WHERE NAME='李四'", 0, value, sizeof (value)); PrintList (data); data = TsqlCtrlReadBlob (This, "SELECT Data1 FROM "TABLE_NAME" WHERE NAME='老六'", 0, value, sizeof (value)); PrintList (data); TsqlCtrlDestroy(This); } } 
  
sql::Ret sql::sqlite::WriteBlob (const char* const sqlCmd, void* pdata, const TUint32 length, const TUint8 column_index) { sql::Ret ret = sql::False; sqlite3_stmt* stmt = NULL; if (!pdata || length == 0) { return sql::False; } std::lock_guard 
  
    guard(this->mtx); if(sqlite3_prepare(this->db, sqlCmd, -1, &stmt, NULL)==SQLITE_OK) { sqlite3_bind_blob(stmt, column_index, pdata, length, NULL); if (sqlite3_step(stmt)==SQLITE_DONE) { ret = sql::True; } sqlite3_finalize(stmt); } return ret; } TBlobData sql::sqlite::ReadBlob (const char* const sqlCmd, const TUint8 column_index, void* pdata, const TUint32 MaxSize) { TBlobData Data; sqlite3_stmt* stmt = NULL; Data.len = 0; Data.pdata = nullptr; if (pdata&&MaxSize==0) { return Data; } std::lock_guard 
   
     guard(this->mtx); if(sqlite3_prepare(this->db, sqlCmd, -1, &stmt, NULL) == SQLITE_OK) { if (sqlite3_step(stmt) == SQLITE_ROW) { const void* val = sqlite3_column_blob(stmt, column_index); Data.len = sqlite3_column_bytes(stmt, column_index); if (pdata) { Data.pdata = pdata; if (Data.len > MaxSize) Data.len = MaxSize; } else { Data.pdata = malloc (Data.len); } if (Data.pdata) { memcpy (Data.pdata, val, Data.len); } else { Data.len = 0; } } sqlite3_finalize(stmt); } return Data; } 
    
  
sql::Ret sql::sqlite::WriteBlob (const char* const sqlCmd, TBlobData data) { sql::Ret ret = sql::False; sqlite3_stmt* stmt = NULL; std::lock_guard 
  
    guard(this->mtx); if(sqlite3_prepare(this->db, sqlCmd, -1, &stmt, NULL)==SQLITE_OK) { // 第二个参数data.GetData(i)->index代表sql语句中?的位置(相对于VALUES中的位置从0开始,如:VALUES(1, ?),则问号的位置为1) sqlite3_bind_blob(stmt, data.column[0], data.pdata[0], data.len[0], NULL); sqlite3_bind_blob(stmt, data.column[1], data.pdata[1], data.len[1], NULL); if (sqlite3_step(stmt)==SQLITE_DONE) { ret = sql::True; } sqlite3_finalize(stmt); } return ret; } TBlobData sql::sqlite::ReadBlob (const char* const sqlCmd, TBlobData data) { TBlobData errdata; sqlite3_stmt* stmt = NULL; std::lock_guard 
   
     guard(this->mtx); if(sqlite3_prepare(this->db, sqlCmd, -1, &stmt, NULL) == SQLITE_OK) { if (sqlite3_step(stmt) == SQLITE_ROW) { TUint32 slen; const void* val; val = sqlite3_column_blob(stmt, data.column[0]); slen = sqlite3_column_bytes(stmt, data.column[0]); if (data.len[0] > slen) data.len[0] = slen; memcpy (data.pdata[0], val, data.len[0]); val = sqlite3_column_blob(stmt, data.column[1]); slen = sqlite3_column_bytes(stmt, data.column[1]); if (data.len[1] > slen) data.len[1] = slen; memcpy (data.pdata[1], val, data.len[1]); } else { sqlite3_finalize(stmt); return errdata; } sqlite3_finalize(stmt); } else { return errdata; } return data; } 
    
  
void main(int argc, char* argv[]) { TBlobData data; TBlobData data2; struct TsqlCtrl* This = CreateSqlCtrl("database.db"); if (This) { TsqlCtrlDelTable (This, TABLE_NAME); if (TsqlCtrlExec(This, "CREATE TABLE "TABLE_NAME" (" "id INTEGER PRIMARY KEY" ",NAME TEXT NOT NULL" ",age INTEGER" ",address TEXT" ",Data1 BLOB" ",Data2 BLOB" ");" , NULL, NULL) != WSQLITE_TRUE) { Werr ("创建表失败!"); } TsqlCtrlExec (This, "INSERT INTO "TABLE_NAME" (id, NAME, age, address) VALUES (NULL, '张三', 19, '北京')", NULL, NULL); TsqlCtrlExec (This, "INSERT INTO "TABLE_NAME" (id, NAME, age, address) VALUES (NULL, '李四', 7, '上海')" , NULL, NULL); TsqlCtrlExec (This, "INSERT INTO "TABLE_NAME" (id, NAME, age, address) VALUES (NULL, '刘五', 39, '广州')", NULL, NULL); TUint8 value[10]; TUint8 value2[10]; data2.len[0] = sizeof (value); data2.len[1] = sizeof (value2); data2.column[0] = 1; data2.column[1] = 2; data2.pdata[0] = value; data2.pdata[1] = value2; for (int i = 0; i < sizeof (value); i++) { value[i] = i + 1; value2[i] = i + 3; } TsqlCtrlWriteBlob (This, "UPDATE "TABLE_NAME" SET Data1=?,Data2=? WHERE NAME='张三'", data2); for (int i = 0; i < sizeof (value); i++) { value[i] = i + 5; value2[i] = i + 9; } TsqlCtrlWriteBlob (This, "UPDATE "TABLE_NAME" SET Data1=?,Data2=? WHERE NAME='李四'", data2); for (int i = 0; i < sizeof (value); i++) { value[i] = i + 20; value2[i] = i + 23; } TsqlCtrlWriteBlob (This, "INSERT INTO "TABLE_NAME" (id, NAME, age, address, Data1, Data2) VALUES (NULL, '老六', 24, '深圳', ?, ?)", data2); data2.column[0] = 0; data2.column[1] = 1; data = TsqlCtrlReadBlob (This, "SELECT Data1,Data2 FROM "TABLE_NAME" WHERE NAME='张三'", data2); PrintList (data); data = TsqlCtrlReadBlob (This, "SELECT Data1,Data2 FROM "TABLE_NAME" WHERE NAME='李四'", data2); PrintList (data); data = TsqlCtrlReadBlob (This, "SELECT id,Data1 FROM "TABLE_NAME" WHERE NAME='李四'", data2); PrintList (data); data = TsqlCtrlReadBlob (This, "SELECT Data1,Data2 FROM "TABLE_NAME" WHERE NAME='老六'", data2); PrintList (data); TsqlCtrlDestroy(This); } } 

各API的使用说明将在后续陆陆续续发表博客进行帮助说明,源代码附带的注释也很详尽,通过注释也可轻松理解代码及框架思路等

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/216395.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午11:57
下一篇 2026年3月18日 上午11:57


相关推荐

  • [java面试题]最长的回文字符串中出现确定[通俗易懂]

    [java面试题]最长的回文字符串中出现确定

    2022年1月16日
    58
  • Ubuntu下安装VSCODE「建议收藏」

    Ubuntu下安装VSCODE「建议收藏」方式一:应用中心安装首先在ubuntu桌面找到应用中心打开在软件中心中,搜索VisualStudioCode当然上面是理想情况,这种图是我在网上搜的。。。我自己的应用中心并不能搜索到VSCODE能找到就在页面中直接选择安装方式二:安装包安装1.从vscode官网下载最新版本,deb包下载地址:https://code.visualstudio.com/docs?dv=linux64当然由于是外网,可能下载速度极慢,这是我下载后上传到百度云的链接,官网下载..

    2025年12月4日
    7
  • 浅谈Console.WriteLine();「建议收藏」

    今日看《老粱故事汇》,介绍日本已逝巨星高仓健,才初步对此人有所了解。老高一生演绎了许多经典的影幕形象,男主角都收获了真挚的爱情……可现实生活中,真实的老高,却一辈子只经历过一次婚姻,在离婚后终究不能从失败的婚姻中走出,最终孤老一生……所以,看事物,看人,不能光看表面,要有一双发现的眼睛,看到他的本质……   借此机会,讲一个C#中用于输出的最常见不过的语句的一个注意事项……谈到Cons

    2022年4月17日
    67
  • seq2seq模型以及其tensorflow的简化代码实现

    seq2seq模型以及其tensorflow的简化代码实现

    2021年11月19日
    44
  • 【学生信息管理系统】与后端系统接口

    【学生信息管理系统】与后端系统接口

    2022年1月11日
    68
  • 软件是bs架构还是cs架构_数据库为什么cs架构

    软件是bs架构还是cs架构_数据库为什么cs架构从定义上:CS即客户端到服务器架构;BS即浏览器到服务器架构从效率上:C/S效率高,大部分的数据已经安装在系统上,B/S效率低,每次都要加载最新的数据从迭代升级上:C/S需要删除老版本在安装新版本(在升级完成桌面图标会有一个刷新的动作);B/S则无缝升级;从安全上:C/S更安全,需要安装\注册\登录;B/S有浏览器就可以使用,安全程度低;从开发成本上:B/S成本低;C/S需要不同的系统开发人员,成本高…

    2025年10月9日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号