在使用room的时候,如果要保存的entity中有 bitmap,或者其他复杂的对象,我们没办法直接保存,这个时候,就涉及到类型转换
https://medium.com/@rasim0042/type-converter-for-room-db-2700e968a6d5
比如下面这个entity,想要直接保存bitmap,这个时候,我们需要告诉room如何进行类型转换
@Entity(tableName = "running_table")
data class Run(
var img: Bitmap? = null,
var timestamp: Long = 0L,
var avgSpeedInKMH: Float = 0f,
var distanceInMeters: Int = 0,
var timeInMillis: Long = 0L,
var caloriesBurned: Int = 0
) {
@PrimaryKey(autoGenerate = true)
var id: Int? = null
}
写一个Converters,具体的转换方法上添加@TypeConverter注释
class Converters {
@TypeConverter
fun toBitmap(bytes: ByteArray): Bitmap {
return BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
}
@TypeConverter
fun fromBitmap(bmp: Bitmap): ByteArray {
val outputStream = ByteArrayOutputStream()
bmp.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
return outputStream.toByteArray()
}
}
然后将这个注册到数据库
@Database(
entities = [Run::class],
version = 1
)
@TypeConverters(Converters::class)
abstract class RunningDatabase : RoomDatabase() {
abstract fun getRunDao(): RunDAO
}
这样在保存数据的时候就可以直接操作了
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertRun(run: Run)
读取也是可以直接返回
@Query("SELECT * FROM running_table ORDER BY distanceInMeters DESC")
fun getAllRunsSortedByDistance(): LiveData<List<Run>>