我有一个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上运行的服务写入数据库的事实)。我已经尝试更改字节顺序并再次写入磁盘,但我得到了相同的结果。任何人都可以建议我可能做错了什么/失踪。非常感谢任何帮助。
答案 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
来查看,这将添加文件,就好像您使用了来了