将未知大小的大 blob 写入 SQLite

Sim*_*rta 5 sqlite

我正在实现一个流接口,它从流中获取二进制数据(例如 HTTP 下载或 Android content:// 共享)并将其存储到 SQLite blob 中。

有没有办法在不提前知道最终尺寸的情况下使用sqlite3_blob_opensqlite3_blob_write接口?

sqlite3_blob_open 指出:

使用 sqlite3_blob_bytes() 接口来确定打开的 blob 的大小。此接口可能不会更改 blob 的大小。使用 UPDATE SQL 命令更改 blob 的大小。


我当前的代码看起来像这样。设置初始大小 (1):

// set size of attachment
{
    auto stmt = session_->prepare(
                "UPDATE attachments_content "
                "SET content = zeroblob(:size) "
                "WHERE rowid = :rowid");
    stmt.bind(":size", size_);
    stmt.bind(":rowid", rowid);
    stmt.execWithoutResult();
}
Run Code Online (Sandbox Code Playgroud)

获取 blob 句柄 (2),这是一个包装sqlite3_blob_open

    auto blob = session_->openBlob("main", "attachments_content",
                                  "content", rowid,
                                  SmartSqlite::Blob::READWRITE);
Run Code Online (Sandbox Code Playgroud)

写一段数据(3):

        blob.write(data.data(), data.size(),
                   progress.bytesProcessed /* offset */);
Run Code Online (Sandbox Code Playgroud)

鉴于blob对象无法调整 blob 的大小,有没有其他方法可以逐步增加 blob 大小然后接收更多数据?

CL.*_*CL. 4

修改 blob 的唯一三种方法是

  • 使用 SQL 语句,或者
  • 使用sqlite3_blob_*()无法调整 blob 大小的接口,或者
  • 直接修改数据库文件

由于 SQLite 的记录格式,更改 blob 的大小可能需要重写整行。因此,你想要的事情无法高效地完成。

我会考虑将流写入临时文件并随后处理它。