Android应用无法打开自行存入Room Database的非txt文件问题排查
问题根因
Files实体类的fileData字段配置错误,你将该字段的typeAffinity设置为ColumnInfo.TEXT,但二进制字节数组在SQLite中需要用BLOB类型存储。TEXT类型会强制将二进制数据按文本编码规则解析,非文本类的二进制文件(图片、音视频、文档等)会在这个过程中出现字节丢失、篡改,只有纯文本的.txt文件不会受编码转换影响,所以只有txt文件可以正常打开。- 你额外添加的
FileTypeConverter类型转换器存在问题,Room本身原生支持byte[]类型字段直接映射到SQLite的BLOB类型,不需要额外做类型转换。你的转换器大概率实现了byte[]和String的互转逻辑,这个转换会破坏非文本文件的二进制结构。
修复步骤
- 修改
Files实体类的fileData字段配置,删除@TypeConverters注解,将typeAffinity改为ColumnInfo.BLOB:
// 调整后的fileData字段配置 @ColumnInfo(name = "FileData", typeAffinity = ColumnInfo.BLOB) private byte[] fileData;
- 删除自定义的
FileTypeConverter类,避免不必要的类型转换干扰。 - 可选优化:在读取文件转字节数组的逻辑中,补充
ByteArrayOutputStream的关闭调用,符合编码规范。 - 重新测试插入非文本文件,即可正常读取打开。
内容的提问来源于stack exchange,提问作者svstackoverflow
相关产品推荐
相关产品推荐

