sqlite3的图片的(二进制数据)存取操作

前言

在实际项目中遇到了图片数组存贮的问题,最后用blob将图片数组存下来,下面介绍一下简单方法。

开发示例

sqlite3支持对二进制数据的缓存,在实际的编程开发当中我们经常要处理一些大容量二进制数据的存储,如图片、音乐、视频等等。对于这些二进制数据,我们不能像处理普通的文本那样,但是我们可以用blob来存储。sqlite官方文档对blob 字段的解释是

BLOB. The value is a blob of data, stored exactly as it was input。

sqlite3_bind_blob示例代码

char* cmdCreatBlobTable = "create table SqliteBlobTest (id integer , pic blob);  //首先创建一个可插入blob类型的表 。
sqlite3* db = NULL;
char * errorMessage = NULL;
int iResult = sqlite3_open("SqliteTest.db", &db);
sqlite3_exec(db,"drop table if exists SqliteBlobTest",0,0,0);  

iResult = sqlite3_exec(db, cmdCreatBlobTable, NULL, NULL, &errorMessage);
if (SQLITE_OK != iResult)
{
    cout<<"创建表SqliteBlobTest失败"<<endl;
    break;
}

sqlite3_stmt *stmt;                                            //声明
const char* sql = "insert into SqliteBlobTest values(1,?)";  
char* pPicData = "this is a pic data" ;
sqlite3_prepare(db,sql,strlen(sql),&stmt,0);                   //完成对sql语句的解析
{  
    sqlite3_bind_blob(stmt,1,pPicData, strlen(pPicData), NULL);//1代表第一个?
    sqlite3_step(stmt);                                        //将数据写入数据库中
} 

sqlite3_prepare(db, "select * from SqliteBlobTest", -1, &stmt, 0);
int result = sqlite3_step(stmt);
int id = 0,len = 0; 
char picData[128] = {0}; 
if (result == SQLITE_ROW)                                     //查询成功返回的是SQLITE_ROW
{
    cout<<"read success from sqlite"<<endl;
    id = sqlite3_column_int(stmt, 0);                         //从0开始计算,id为0,picdata 为1;
    const void * pReadPicData = sqlite3_column_blob(stmt, 1); //读取数据,返回一个指针
    len = sqlite3_column_bytes(stmt, 1);                      //返回数据大小
    memcpy(picData, pReadPicData, len);                       //把数据拷贝出来
}
else
{
    cout<<"read fail from sqlite"<<endl;
}
sqlite3_finalize(stmt);                                      //把刚才分配的内容析构掉
cout<<id<<" "<<picData<<endl;

转载博客链接:sqlite3的图片的(二进制数据)存取操作

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C++中更新SQLite3中的二进制数据,您可以使用SQLite3提供的BLOB类型。以下是一个简单的示例代码,它演示如何更新一个名为"my_table"的表中的二进制数据列"my_blob_column": ```c++ #include <sqlite3.h> #include <iostream> #include <fstream> using namespace std; int main() { // Open database sqlite3 *db; int rc = sqlite3_open("my_database.db", &db); if (rc != SQLITE_OK) { cerr << "Error opening database: " << sqlite3_errmsg(db) << endl; sqlite3_close(db); return 1; } // Read binary data from a file ifstream file("my_binary_data.bin", ios::binary | ios::ate); if (!file.is_open()) { cerr << "Error opening file." << endl; sqlite3_close(db); return 1; } streamsize size = file.tellg(); file.seekg(0, ios::beg); char *buffer = new char[size]; if (!file.read(buffer, size)) { cerr << "Error reading file." << endl; delete[] buffer; sqlite3_close(db); return 1; } file.close(); // Update binary data in database sqlite3_stmt *stmt; const char *sql = "UPDATE my_table SET my_blob_column = ? WHERE id = 1;"; rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); if (rc != SQLITE_OK) { cerr << "Error preparing statement: " << sqlite3_errmsg(db) << endl; delete[] buffer; sqlite3_close(db); return 1; } sqlite3_bind_blob(stmt, 1, buffer, size, SQLITE_TRANSIENT); rc = sqlite3_step(stmt); if (rc != SQLITE_DONE) { cerr << "Error updating data: " << sqlite3_errmsg(db) << endl; delete[] buffer; sqlite3_finalize(stmt); sqlite3_close(db); return 1; } // Cleanup delete[] buffer; sqlite3_finalize(stmt); sqlite3_close(db); return 0; } ``` 在这个示例中,我们首先打开了一个名为"my_database.db"的SQLite3数据库。然后,我们从一个名为"my_binary_data.bin"的文件中读取二进制数据,并将其存储在一个名为"buffer"的字符数组中。接下来,我们准备了一个SQL语句,使用"sqlite3_prepare_v2"函数编译该语句,并使用"sqlite3_bind_blob"函数绑定二进制数据到该语句中。最后,我们使用"sqlite3_step"函数执行该语句并更新数据库中的二进制数据。最后,我们清理并关闭数据库。 请注意,在这个示例中,我们使用了一个名为"SQLITE_TRANSIENT"的特殊标记来告诉SQLite3库,我们正在使用动态分配的内存来存储二进制数据。这意味着SQLite3库将复制这些数据,而不是仅仅在内部保存指向该数据的指针。这可以确保在更新期间,我们的内存不会被释放或修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值