首页 > 解决方案 > 使用或不使用 (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 兆字节。

标签: androidsqliteandroid-sqliteandroid-room

解决方案


没有真正的优势/劣势,当然不是在运行时,也许在编译时很少。

这就是 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`))");
  • 即列picture1picture2的定义是相同的列名。
  • 注意请注意关于不更改生成代码的警告

推荐阅读