我正在实现一个流接口,它从流中获取二进制数据(例如HTTP下载或Android内容://共享)并将其存储到SQLite blob中。
有没有办法在不事先知道结束大小的情况下使用sqlite3_blob_open
和sqlite3_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大小,然后接收更多数据?
答案 0 :(得分:2)
修改blob的唯一三种方法是
sqlite3_blob_*()
接口,或由于SQLite的record format,更改blob的大小可能需要重写整行。因此,你想要的不能有效地完成。
我会考虑将流写入临时文件并在之后处理它。