2016-11-21 69 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

聽起來似乎合理,謝謝。但我仍然有一些希望,有人對此限制採取瞭解決方法。 –