2009-03-24 12 views
6

私はSQLiteアプリに大きなブロブを持っており、これらのブロブの小さなセグメントを区分的に更新する必要があります。 "Blob BのBからBのデータをDのデータに更新する"と言っているようなものですが、これはBlobの操作機能を持つ他のデータベースでも実行できますが、SQLiteのようなものは見つけられません。あるいは、SQLiteはBLOBを操作する方法を持っていますか?SQLiteでピース単位でBLOBを更新するには?

ありがとうございました。

答えて

4

SQLite 3.xはこれをsqlite3_blob_write機能でサポートしています。

int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset) 

この関数は、SQLite 3 C/C++ APIの一部として提供されています。これを使用するには、これに対して直接プログラムする必要があります。

System.Data.SQLiteのような他の上位ラッパーを使用している場合は、前回見たときにこの関数にアクセスすることはできません。

7

これはあなたの質問に対する答えではありませんが、SQLiteの(大)ブロブに対してランダムアクセスを使用している経験があります。理由は次のとおりです。

ブロブはSQLクエリフォーマットを完全に破ります。 BLOBデータに何らかの処理が必要な場合は、確かにある時点でフィルタリングが必要になります。この点に関して、SQLでのフィルタリングに対処するための仕組みは無駄になります。

rawファイルのバイナリデータとは対照的なデータベースにラップされたバイナリブロブを扱うと、オプションが制限されます。複数のプロセスから同時にデータをランダムに読み書きすることはできません。これはファイルで可能です。このデータを扱うツールは使用できず、ファイルI/Oインターフェイスのみを提供します。ブロブを切り捨てたりサイズを変更することはできません。ファイルは単に汎用性があります。

バックアップと転送を簡略化するため、すべてのファイルを1つのファイルに格納するのが便利だと思われるかもしれませんが、ブロブを扱う苦労は価値がありません。

あなたの代理人として、あなたのblobを生ファイルとしてファイルシステムに書き、ファイル名への参照を単にデータベースに保存することをお勧めします。あなたのブロブがかなり小さく、成長しないことが保証されている場合は、私の助言を忘れてください。

+1

しかし、それはサービスの完全なアップグレード中だから、「製品サイクル」内では一定の長さであると言う「安全」なので(長くても短くてもよい) –

+0

しかし、私はあなたが言うすべての単語に完全に同意する、私は本当にブロブを避けることを好むだろうが、仕様がレイアウトされている方法のため、私は選択肢がありません:/ –

+0

親指。彼はこのことが終わる前に多くの法的助言を必要としています。 :P – Cray

3

私はpaniqが言ったことすべてに強く同意します。 BLOBを使用すると、オプションが大幅に制限されます。

System.Data.SQLiteを使用している場合、BLOBを実際にサポートすることはできません。だからこそ私は自分のクラスを書いてそれを扱いました。ここにコードを見つけることができます:Sample BLOB code

SQLiteには、BLOBを扱う人のためにいくつかの落とし穴があります。大きな問題の1つは、SQLiteがBLOBフィールド全体をメモリにロードしてから長さをチェックすることです。BLOBフィールドが大きいとメモリのスラッシングが多く発生することがあります...

+0

ファイルが見つかりません –

関連する問題