sqlite3 c++: retrieving a blob

sqlite3 c++: retrieving a blob

本文关键字:blob retrieving c++ sqlite3      更新时间:2023-10-16

我有一个sqlite3数据库,其中存储了一个。png图像作为BLOB

我试图通过c++接口像这样检索原始数据

RawImageWrapper* obj = 0;
int rc = sqlite3_exec(db, action.c_str(), imageSelectCallback, obj, &errMsg);

其中动作只是我的SQL语句(它返回正确的记录)和RawImageWrapper看起来像这样

struct RawImageWrapper
{
    int callback(int argc, char **argv, char **azColName) {
        for (int i = 0; i < argc; i++) {
            if (strcmp(azColName[i], "Image") == 0) {
                buff = std::string(argv[i]);
                return 0;
            }
        }
        return 1;
    }
    std::string buff;
};

使用字符串保存图像数据可能不是最好的,但我只是想要一个快速的对象来包装char[]。但是,当它试图构造buff.

时,由于访问冲突而失败。

什么是正确的方式来检索这个图像blob从我的数据库和加载到一些容器?我计划在稍后的时间从原始数据中重建图像

sqlite3 blob数据的问题是,如果你不知道blob的大小,那么你不能从char*构建string或任何其他对象。因为blob数据可以有null值,当您生成string时,它将在获得null后立即停止,忽略其余数据。

我知道两个解决这个问题的方法:

  1. SELECT语句中添加LENGTH(BLOB_COLUMN)形式的额外输出,以字节为单位给出blob列的大小。
  2. 将blob列转换为十六进制值使用select hex(BLOB_COLUMN) from ...,现在你得到一个正常的十六进制string,此后你必须转换为原始字节数组。