Android 带有NUL字符的SQLite select blob

Android 带有NUL字符的SQLite select blob,android,sqlite,busybox,Android,Sqlite,Busybox,我无法从SQLite数据库中获取blob。当我尝试一个SELECT语句时,我只得到第一个NUL之前的几个字符,然后它就停止了 我的目标是将blob保存为zip文件(blob就是这个文件),以便用另一个应用程序进行进一步处理。我能够通过SELECT hex(数据)成功获得blob的十六进制版本,但这对我没有帮助,因为它的格式不正确。我在安卓手机上使用BusyBox,有一个hexcode-r命令可以反转十六进制输出,但它只有在格式化为规范的十六进制+ASCII显示时才能工作。因此,我希望得到blob

我无法从SQLite数据库中获取blob。当我尝试一个SELECT语句时,我只得到第一个NUL之前的几个字符,然后它就停止了

我的目标是将blob保存为zip文件(blob就是这个文件),以便用另一个应用程序进行进一步处理。我能够通过SELECT hex(数据)成功获得blob的十六进制版本,但这对我没有帮助,因为它的格式不正确。我在安卓手机上使用BusyBox,有一个hexcode-r命令可以反转十六进制输出,但它只有在格式化为规范的十六进制+ASCII显示时才能工作。因此,我希望得到blob文本,因为我可以简单地将其保存为zip文件


那么,我怎样才能得到包括NUL字符在内的整个blob呢?我读过关于装订的书,但我不太懂。如果这就是解决方案,我将如何在Android的shell命令中使用Busybox编写它?

当您尝试将blob视为字符串时,NUL将被解释为终止符

确保BLOB始终作为BLOB访问,也就是说,不要尝试使用SQL中的值执行任何字符串操作,使用诸如instead而不是
getString
,以及使用字节数组而不是字符串之类的函数:

cursor=db.rawQuery(“从…中选择数据,…);
if(cursor.moveToFirst()){
字节[]数据=cursor.getBlob(0);
FileOutputStream file=newfileoutputstream(“…/data.gz”);
GZIPOutputStream压缩器=新的GZIPOutputStream(文件);
压缩机。写入(数据);
}

在这方面连续工作了8个小时后,我终于得到了我需要的东西。以下是我使用的命令:

echo -ne "$(echo | sqlite3 /data/data/com.google.android.apps.googlevoice/databases/model.db "SELECT HEX(data) FROM conversations LIMIT 1;" | sed -e 's/../\\x&/g')" > /sdcard/output.zip

结果是在数据库中存储为blob的zip文件。我希望这对将来的人有帮助

谢谢你的回复。我试图使用shell命令将blob作为zip文件导出,这样就可以通过终端仿真器或adb shell完成。如何修改您的代码以在该介质中工作?我在初始化sqlite3之后尝试了它,它在游标附近说语法错误。