2016-07-01 13 views
0

私の.mbtiles SQLite dbの中には、照会されている特定のタイルに関する情報を保持するtile_dataという列があります。C#を使用したSQLite DBの単一ブロブの解凍

私のアプリケーションでは入力としてlong/latを使用してから、tile_rowtile_column相当の値に変換してから、以下のSQLクエリを介して内部のデータを含む単一のBLOBを取り出します。

問合せは、(完全に機能し、単にコードを表示する)である。結果は、すべてのデータを単一のタイルを引き戻すますSELECT *を照会し、単一 BLOBファイルされた状態で

string query = 
    String.Format("SELECT tile_data from tiles WHERE zoom_level = {0} AND tile_row = {1} AND tile_column = {2}", ZoomLevel, _merc.TileLat, _merc.TileLong); 
    SQLiteCommand command = new SQLiteCommand(query, DbConn); 
    SQLiteDataReader reader = command.ExecuteReader(); 

      while (reader.Read()) 
       { 
        // ... 
       } 

ブロブの内側にあるtile_dataは、私がアクセスして作業する必要がある圧縮(gzip)ベクターファイルですが、アプリケーション内で解凍する方法がわかりません。私が読んだほとんどのgzipリンクはファイル圧縮に関するもので、.txt(または類似のもの)に出力していましたが、私は外部ファイルを必要とせずにこのデータをメモリ内で使用しようとしています。

ブロブを解凍して外部ファイルではなくメモリ内のデータにアクセスするにはどうすればよいですか?

+0

'MemoryStream'にデータを渡し、' CompressionMode.Decompress'を使って 'GZipStream'に渡し、' StreamReader'に渡すことができるはずです。 – juharr

+0

'SqlDataReader.GetStream'を使うと、ファイル全体を' MemoryStream'に読み込むのではなく、チャンク内のデータを取り込むことができます。 – juharr

答えて

1

は、あなたのファイルはあなたがリーダーの異なるタイプを代用する必要があるかもしれませんですまさにによってはこの

SQLiteDataReader reader = command.ExecuteReader(); 
while (reader.Read()) 
{ 
    using(var file = reader.GetStream(0)) 
    using(var unzip = new GZipStream(file, CompressionMode.Decompress)) 
    using(var fileReader = new StreamReader(unzip)) 
    { 
     while(!fileReader.EndOfStream) 
     { 
      var line = fileReader.ReadLine(); 
     } 
    } 
} 

のようなものを試してみてください。

関連する問題