如何在kotlin中为房间做转换器ArrayList<Bitmap>?

问题描述 投票:0回答:1

嗨,我需要在 Room 数据库中存储位图数组,例如

@ColumnInfo(name = "imageList")
    var imageList: ArrayList<Bitmap>

但我无法以正确的方式做到这一点,因为我认为我的转换器。它只将第一个元素放入位图列表中。我该如何解决这个问题?

class BitmapListConverter {
    @TypeConverter
    fun toBitmapList(bitmap: Bitmap): ArrayList<Bitmap> {
        return arrayListOf(bitmap)
    }

    @TypeConverter
    fun fromBitmapList(array:ArrayList<Bitmap>): Bitmap {
        val bmp = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888) 
        return if (array.isEmpty()) bmp else array.first() //this causing issue
    }
}
kotlin android-room android-bitmap
1个回答
0
投票

使用 SQLite 和 Room,一列只能包含 1 项数据。类型转换器必须将任何数据转换为单个数据单元,可以是整数类型值(SQLite 中的 INTEGER 类型)、小数类型值(REAL 类型)、null(除非指示没有数据,否则无用)、字符流(TEXT 类型)或字节流 (BLOB)。

Null、INTEGER 和 REAL 类型对于存储某项列表可能没什么用处。

您期望将许多位图保存为单个位图,但只得到第一个。如果您可以将位图附加到许多位图中,那么就可以了。也许一些位图处理库/实用程序可以完成此任务。但是,您还需要将单个位图分解/拆分为多个位图。这可能是一项相当艰巨的任务,因为位图不太可能包含分解许多位图所需的附加信息。

我建议使用一个表(一个

@Entity
带注释的类),其中每行存储一个位图。然后,位图可以是父表的子项,并且您将拥有一个 POJO 类,该类将具有用
@Entity
注释的父(
@Embedded
带注释的类)字段和用
@Relation
注释的 ArrayList 字段。

必须就关系类型做出决定。它可能是一个有多个子项的父项,在这种情况下,子项

@Entity
(位图)可以有一个字段来唯一标识子项的父项。

  • 这似乎就足够了,但缺点是,如果许多父母使用同一个位图,则该位图必须存储多次(基本上是复制存储的位图)

另一种选择可能是建立多对多关系,其中单个位图可以有多个父级,并且许多父级可以与许多子级(位图)相关。这种关系是通过具有两个核心列/字段的第三个表来实现的;一个用于父母的唯一标识符;另一个用于位图的唯一标识符。两列组合起来将形成主键(请注意,必须使用

primaryKey
注释的
@Entity
参数来指定此复合主键)。

对于这种多对多关系,POJO 中的

@Relation
注释的不同之处在于,它将包含
associateBy
参数来指定
Junction
(第三个表中唯一标识父级和子级的列的名称)。

© www.soinside.com 2019 - 2024. All rights reserved.