android - 使用或不使用 (typeAffinity = ColumnInfo.BLOB) 在 Room 数据库中存储图像数据
问题描述
我知道直接将图像存储在数据库中不是最佳做法,我们应该存储路径。但就我而言,这是必须的。
我能够存储完美定义为的图像列表:
@ColumnInfo(name = "picture")
var picture: ByteArray? = null
我遇到了建议使用的解决方案(typeAffinity = ColumnInfo.BLOB)
。所以我把我的专栏改成:
@ColumnInfo(name = "picture", typeAffinity = ColumnInfo.BLOB)
var picture: ByteArray? = null
我没有注意到任何重要的性能。我想知道使用typeAffinity
或不使用它的可能优点是什么?
值得一提的是,我的图像总是小于 1 兆字节。
解决方案
没有真正的优势/劣势,当然不是在运行时,也许在编译时很少。
这就是 usingtypeAffinity=?
所做的就是覆盖由变量的字段/列的类型确定的 typeAffinity 。
正如您所拥有var picture: ByteArray
的,无论如何这将被解析为 BLOB 列类型。
如果您希望可以同时编译并通过查看生成的 java.lang.
也许考虑使用两者的以下实体:-
@Entity(tableName = "user")
data class UserEntity(
@PrimaryKey
val userid: Long = 0,
var picture1: ByteArray? = null,
@ColumnInfo(typeAffinity = ColumnInfo.BLOB)
var pitcure2: ByteArray? = null
)
在生成的 Java 中(使用 Android 视图作为突出显示),然后在 @Database 类(示例中为 UserDatabase)中以(示例中为 UserDatabase_Impl)为后缀,以下是生成的 Java 的屏幕截图:-_Impl
- 突出显示的 Android 指示选择 Android 视图的位置。
- 代码资源管理器中的突出显示显示扩展的 java(生成)目录中的相应代码 (UserDatabase_Impl)
- 该
createAllTables
方法是用于创建表的方法- room_master_table 是一个房间特定的表,用于使用模式验证现有表以检测是否存在差异。
为创建表生成的代码 (SQL) 是:-
_db.execSQL("CREATE TABLE IF NOT EXISTS `user` (`userid` INTEGER NOT NULL, `picture1` BLOB, `pitcure2` BLOB, PRIMARY KEY(`userid`))");
- 即列picture1和picture2的定义是相同的列名。
- 注意请注意关于不更改生成代码的警告。
推荐阅读
- java - 我有一个关于java多态的问题
- java - 无法部署 Intellij 项目
- java - 未能删除 LinkedList 中的第一个节点,但成功删除其他节点
- mysql - 如何在 CSV 导入(MariaDB / MySQL)上生成串联主键?
- bit-manipulation - Nand2tetris 中的减法实现
- android - 如何为此 api 实现从 Retrofit 获取方法以及模式类将如何在使用 Java 的 Android 中?
- matlab - 如何在 Matlab 中优化正态分布图上的 y 轴?
- java - [严重]:通过 Java 调用 selenium 的 driver.get() 方法时从渲染器接收消息超时:298.674
- python-3.x - Tornado + motor,根据电机文档示例,甚至出现错误
- python-3.x - 我无法调用我的图像将其添加到我的屏幕