使用或不使用 (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`))");
- 即picture1 和 picture2 列的定义是相同的,除了列名。
- 注意请注意关于不更改生成代码的警告。
我知道直接将图像存储在数据库中不是最佳做法,我们应该存储路径。但就我而言,这是必须的。
我能够完美存储图像列表,定义为:
@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`))");
- 即picture1 和 picture2 列的定义是相同的,除了列名。
- 注意请注意关于不更改生成代码的警告。