Android SQLite读取blob

时间:2014-02-12 17:17:37

标签: android sqlite jpeg android-sqlite endianness

我有一个sqlite数据库,它是从运行在Windows(C ++)上的服务编写的。我现在正试图从这个包含一些blob数据的sqlite数据库中读取。我有一些代码如下:

String tileQuery = "SELECT * FROM '" + layerName + "' WHERE zoom_level=?";
Cursor tileCursor = database.rawQuery(tileQuery, new String[] {zoom_level});
if( tileCursor.moveToFirst() )
{
    while( !tileCursor.isAfterLast() )
    {
        int tileRow = tileCursor.getInt(tileCursor.getColumnIndex("tile_row"));
        int tileColumn = tileCursor.getInt(tileCursor.getColumnIndex("tile_column"));
        byte[] tileData = tileCursor.getBlob(tileCursor.getColumnIndex("tile_data"));

        //Write tile to file
        String fileName = layerName + "_" + zoom_level + "_" + tileRow + "_" + tileColumn + ".jpeg";

        try {
            /*
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(Environment.getExternalStorageDirectory().getPath() + TILE_STORAGE_PATH + "/" + fileName));
            bos.write(tileData);
            bos.flush();
            bos.close();
            */
            ByteBuffer bb = ByteBuffer.wrap(tileData);
            bb.order(ByteOrder.LITTLE_ENDIAN);
            FileOutputStream fos = new FileOutputStream(Environment.getExternalStorageDirectory().getPath() + TILE_STORAGE_PATH + "/" + fileName);
            byte[] toWrite = new byte[bb.remaining()];
            bb.get(toWrite, 0 , toWrite.length);
            fos.write(toWrite);
            fos.close();
        } catch (Exception e) {
               e.printStackTrace();
        }

        tileCursor.moveToNext();
    }
}

如图所示,我试图将blob作为jpeg图像写入磁盘。无论我做什么,图像似乎都是腐败的,因为我无法在android中的任何图像查看器上查看它们。可以在Windows上将相同的图像写入文件并正确查看,这使我认为这是一个endianess问题(由于blob是通过在windows上运行的服务写入数据库的事实)。我已经尝试更改字节顺序并再次写入磁盘,但我得到了相同的结果。任何人都可以建议我可能做错了什么/失踪。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

为了完成这项工作,有几个不同的步骤。假设您的数据库连接正常,并且您正在使用Cursor

查找正确的列

(1)将blob转换为Bitmap。您可以使用您获得的blob,假设您实际下载并将其存储到本地数据库,因为您将解码byte []。

Bitmap bm = BitmapFactory.decodeByteArray(tileData, 0 ,tileData.length);

(2)在approprite目录中创建一个新文件并写入该文件。您可以使用下面的代码执行此操作。想法是获取本地目录

private void storeBitmap(Bitmap myBitmap){
    String root = Environment.getExternalStorageDirectory().toString();
    File myDir = new File(root + "/your_directory_name");

    String fname = "your_file_name.jpg";
    File file = new File (myDir, fname);
    if (file.exists ()) file.delete (); 
        try {
            FileOutputStream out = new FileOutputStream(file);
            myBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
            out.flush();
            out.close();

        } catch (Exception e) {
           e.printStackTrace();
        }
    }

如果您想将图片添加到图库或者您只是想要一种不同的(并且可能更容易)添加文件的方式,请使用MediaScanner来查看,这将添加文件,就好像您使用了来了