2016-11-21 66 views
2

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

有没有办法在事先不知道最终大小的情况下使用sqlite3_blob_opensqlite3_blob_write接口?

sqlite3_blob_open指出:

使用sqlite3_blob_bytes()接口来确定开斑的大小。这个接口不能改变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(); 
} 

获取团块手柄(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

修改斑点的只有三种方式

  • 使用SQL语句,或
  • 使用sqlite3_blob_*()接口,不能调整大小的斑点,或
  • 直接修改database file

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

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

+0

听起来似乎合理,谢谢。但我仍然有一些希望,有人对此限制采取了解决方法。 –