将大小未知的blob写入SQLite

时间:2016-11-21 15:45:58

标签: sqlite

我正在实现一个流接口,它从流中获取二进制数据(例如HTTP下载或Android内容://共享)并将其存储到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();
}

获取blob句柄(2),这是sqlite3_blob_open

的包装器
    auto blob = session_->openBlob("main", "attachments_content",
                                  "content", rowid,
                                  SmartSqlite::Blob::READWRITE);

写一段数据(3):

        blob.write(data.data(), data.size(),
                   progress.bytesProcessed /* offset */);

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

1 个答案:

答案 0 :(得分:2)

修改blob的唯一三种方法是

  • 使用SQL语句或
  • 使用无法调整blob大小的sqlite3_blob_*()接口,或
  • 直接修改database file

由于SQLite的record format,更改blob的大小可能需要重写整行。因此,你想要的不能有效地完成。

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