使用或不使用 (typeAffinity = ColumnInfo.BLOB) 在 Room 数据库中存储图像数据

Storing image data in Room database with or without using (typeAffinity = ColumnInfo.BLOB)

我知道直接将图像存储在数据库中不是最佳做法,我们应该存储路径。但就我而言,这是必须的。

我能够完美存储图像列表,定义为:

@ColumnInfo(name = "picture")
var picture: ByteArray? = null

我遇到了建议使用 (typeAffinity = ColumnInfo.BLOB) 的解决方案。所以我将我的专栏更改为:

@ColumnInfo(name = "picture", typeAffinity = ColumnInfo.BLOB)
var picture: ByteArray? = null

我没有注意到任何重要的性能。我想知道使用 typeAffinity 的可能优点或不使用它的缺点是什么?

也许值得一提的是我的图片总是小于 1 兆字节。

没有真正的 advantage/disadvantage,肯定不会在 运行 时间,也许在编译时间略微。

这就是使用 typeAffinity=? 所做的全部工作是覆盖由变量 field/column 的类型确定的类型亲和力。

因为你有 var picture: ByteArray 这无论如何都会被解析为 BLOB 列类型。

如果您希望可以同时编译两者并通过查看生成的 java 查看结果 SQL。

或许考虑以下同时使用两者的实体:-

@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中class(示例中的UserDatabase)后缀为_Impl(所以例子中是UserDatabase_Impl)下面是生成的[=76的截图=] :-

  • Android 突出显示表示 select Android 视图的位置。
  • 代码浏览器中的突出显示显示了扩展的 java(生成的)目录中的相应代码 (UserDatabase_Impl)
  • createAllTables方法是用来创建table(s)的方法
    • room_master_table 是特定于房间的 table,用于验证现有 table 与架构是否存在差异。

为创建 table 而生成的代码 (SQL) 是:-

_db.execSQL("CREATE TABLE IF NOT EXISTS `user` (`userid` INTEGER NOT NULL, `picture1` BLOB, `pitcure2` BLOB, PRIMARY KEY(`userid`))");
  • picture1picture2 列的定义是相同的,除了列名。
  • 注意请注意关于不更改生成代码的警告