You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kotlin的Room数据库中实现ArrayList<Bitmap>类型转换器?

解决Room数据库存储Bitmap列表的类型转换器问题

你的当前转换器逻辑完全错误:toBitmapList是把单个Bitmap包装成列表,fromBitmapList则是从列表里取第一个元素返回,这必然只能存储列表的第一个元素。要实现完整的Bitmap列表存储,需要将整个列表序列化为Room支持的可存储格式,再反序列化为Bitmap列表。

正确的类型转换器实现

核心思路是将每个Bitmap转成Base64字符串,把列表转成字符串列表(Room原生支持存储List类型),读取时再逐个转回Bitmap:

import android.graphics.Bitmap
import android.graphics.BitmapFactory
import androidx.room.TypeConverter
import java.io.ByteArrayOutputStream
import android.util.Base64

class BitmapListConverter {
    // 将Bitmap列表转为Base64字符串列表,供Room存储
    @TypeConverter
    fun bitmapListToBase64List(bitmapList: ArrayList<Bitmap>): List<String> {
        return bitmapList.map { bitmap ->
            val outputStream = ByteArrayOutputStream()
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
            val byteArray = outputStream.toByteArray()
            Base64.encodeToString(byteArray, Base64.DEFAULT)
        }
    }

    // 将Base64字符串列表转回Bitmap列表
    @TypeConverter
    fun base64ListToBitmapList(base64List: List<String>): ArrayList<Bitmap> {
        val bitmapList = arrayListOf<Bitmap>()
        base64List.forEach { base64String ->
            val byteArray = Base64.decode(base64String, Base64.DEFAULT)
            BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size)?.let {
                bitmapList.add(it)
            }
        }
        return bitmapList
    }
}

注意事项

  • 必须在你的Room Database类或对应Entity类上添加注解:@TypeConverters(BitmapListConverter::class),让Room识别该转换器
  • 示例中用PNG格式压缩Bitmap,若需要更小存储体积可改用JPEG,但会损失画质
  • 大尺寸Bitmap列表会占用较多内存,建议存储前先压缩Bitmap的尺寸

内容的提问来源于stack exchange,提问作者Abdullah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:42:39