2016-11-21 10 views
2

ストリームからバイナリデータを取得するストリームインターフェイス(たとえば、HTTPダウンロードのAndroidコンテンツ://共有)を実装し、SQLite BLOBに保存します。未知のサイズの大きなブロブをSQLiteに書き込む

エンドサイズを事前に知らなくてもsqlite3_blob_opensqlite3_blob_writeインターフェイスを使用する方法はありますか?

は(sqlite3_blob_bytesを使用して)開いたブロブのサイズを決定するためのインターフェース:

sqlite3_blob_open状態。ブロブのサイズは、このインタフェースでは変更できません。 BLOBのサイズを変更するには、UPDATE SQLコマンドを使用します。


私の現在のコードは次のようになります。 (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

唯一の3つの方法が直接database fileを変更するsqlite3_blob_*()ブロブのサイズを変更することができないインタフェース、または

  • を使用するSQL文、又は
  • を使用する

    • あります。

    SQLiteのrecord formatのため、BLOBのサイズを変更すると、行全体を書き換える必要があります。したがって、あなたが望むものは効率的に行えません。

    ストリームを一時ファイルに書き込んだり、後で処理することを検討したいと思います。

  • +0

    ありがとうございます。しかし、私はまだ誰かがこの制限の回避策を持っているという希望を持っています。 –

    関連する問題