DB查询返回Android上损坏的数据

DB查询返回Android上损坏的数据,android,database,image,sqlite,cursor,Android,Database,Image,Sqlite,Cursor,我有一个带有示例表的SQLite DB,它存储在assets/文件夹中 此数据库包含一个表,其中一列是包含BMP图像的BLOB。我可以在主机上使用JDBC完美地读/写这个图像 然后使用以下代码从仿真器访问数据: final Cursor cursor = db.query(TABLE_NAME, FROM, null, null, null, null, null); if (cursor.moveToFirst()) { byte[] icon = cursor.getBlob(cu

我有一个带有示例表的SQLite DB,它存储在assets/文件夹中

此数据库包含一个表,其中一列是包含BMP图像的BLOB。我可以在主机上使用JDBC完美地读/写这个图像

然后使用以下代码从仿真器访问数据:

final Cursor cursor = db.query(TABLE_NAME, FROM, null, null, null, null, null);

if (cursor.moveToFirst()) {
    byte[] icon = cursor.getBlob(cursor.getColumnIndex(SearchEngines.ICON));
    // ...
但解码检索图像的尝试失败:

final Bitmap icon = BitmapFactory.decodeByteArray(icon , 0, icon.length);
我在日志中得到空结果和以下内容:

DEBUG/skia(374): --- decoder->decode returned false
在此之后,我将blob数组转储到文件中,并与原始图像进行比较。这是一个完全令人惊讶的发现,因为唯一未发现的区别是在检索的blob中,所有0x00字节都被0x25 0x30序列替换:

0x00 -> 0x25 0x30 // %0
除此之外,所有数据都完好无损。怎么回事

更新1。从仿真器中提取数据库后,adb提取的数据中包含的数据已损坏%0个符号。因此,问题要么在于数据库本身,要么在于query/getBlob或其他数据库访问代码的实现/使用

更新2*似乎这是错误的*据我所知,SQLite支持两种存储大型对象的方法:文本和BLOB。文本列不包含0x00字节,在blob中0x00被转换为%0真是太巧了!。所以,我得到的似乎是内部表示,而不是实际数据

更新3。添加到DB的代码如下所示:

private void save(Connection conn, String id, String fileName) throws SQLException, IOException {
    final String sql = "UPDATE " + TABLE_NAME + " SET " + BLOB_COLUMN_NAME + " = ? WHERE " + ID_COLUMN_NAME + " = ?";
    System.out.println("Executing: " + sql);

    final PreparedStatement pstmt = conn.prepareStatement(sql);
    pstmt.setInt(2, Integer.valueOf(id));

    File fBlob = new File(fileName);
    FileInputStream is = new FileInputStream(fBlob);

    byte[] bytes = new byte[(int) fBlob.length()];
    int rc = is.read(bytes);
    assert (rc == bytes.length);
    System.out.println("Total size: " + rc);

    pstmt.setBytes(1, bytes);
    pstmt.execute();
}

这不是很特别吗?三个问题。这是以前的工作,还是所有的新代码?通过将位图写入文件而不是存储在数据库中,可以将问题隔离到数据库或应用程序代码中吗?另外,从您的表\u name;中选择类型的\u blob\u列的结果是什么;?回答您的问题:1不,不可能将其缩小为几行更改的代码。它在实现时就失败了。2问题肯定在数据库中:使用adb pull从模拟器检索数据库后,它包含相同的乱码数据。@Catcall:我会尽快检查select typeof。您能准备好要插入的BLOB吗,然后解码它而不是插入它?这可能会为您指明正确的方向。@Andy,您的Update 2中有几个错误陈述:SQLite文本列可能包含0x00字节,尽管嵌入NUL的文本可能很难使用;SQLite BLOB函数不会修改数据,因此这必须发生在Java包装器或DB访问代码中。向我们展示您用于插入blob的代码。