繁体   English   中英

如何退回 Map <string, list<customvo> &gt; 从带有 Android 房间的单房间实体</string,>

[英]How to return a Map<String, List<CustomVO>> from single Room entity with Android Room

我正在调查 Android 房间支持从查询返回地图

我无法克服这个构建错误

error: The columns returned by the query does not have the fields [columnOne,columnTwo,columnThree,columnFour,columnFive,columnSix,columnSeven,columnEight] in org.my.MyDataVO even though they are annotated as non-null or primitive. Columns returned by the query: [columnA,columnB]
    public abstract java.util.Map<java.lang.String, java.util.List<org.my.MyDataVO>> fetchMap(@org.jetbrains.annotations.NotNull()

我的 DAO 查询类似于:-

@MapInfo(keyColumn = "column_a", valueColumn = "column_b")
@Query("SELECT column_a, column_b FROM my_data_table WHERE my_key_column = :myKeyColumn")
fun fetchMap(myKeyColumn: String): Map<String, List<org.my.MyDataVO>>

我的 DO object 类似于:-

@Entity(
    tableName = "my_data_table",
    indices = [
        Index(value = ["key_column"], unique = false),
    ]
)
@TypeConverters(MyDataVOListTypeConverter::class)
data class BookTableContentChildrenDO(
    @ColumnInfo(name = "key_column") val keyColumn: String,
    @ColumnInfo(name = "column_a") val columnA: String,
    @ColumnInfo(name = "column_b") val columnB: List<org.my.MyDataVO>
) {
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "my_data_table_local_id")
    var myDataTableLocalId: Long = 0L
}

我的价值 Object MyDataVO 类似于:-

@Serializable
data class MyDataVO(
    @ColumnInfo(name = "column_one") val columnOne: Long,
    @ColumnInfo(name = "column_two") val columnTwo: String,
    @ColumnInfo(name = "column_three") val columnThree: Boolean,
    @ColumnInfo(name = "column_four") val columnFour: String,
    @ColumnInfo(name = "column_five") val columnFive: String,
    @ColumnInfo(name = "column_six") val columnSix: String,
    @ColumnInfo(name = "column_seven") val columnSeven: String,
    @ColumnInfo(name = "column_eight") val columnEight: Long,
)

我正在尝试的事情是不可能的吗?

我在哪里犯了错误?

为什么不能将 map my_data_table.column_bList<org.my.MyDataVO>

更新

我设法通过将我所有的 TypeConverters 添加到@Database抽象 class 定义来解决构建错误

但是我现在面临一个运行时错误,这看起来很奇怪

我有org.my.MyDataVOList<org.my.MyDataVO>的单个实例的类型转换器,Room 使用 Single instance TypeConverter 来解码List<org.my.MyDataVO>

当我尝试调用我的 DAO fetchMap() function 时,它失败了

java.util.concurrent.ExecutionException: kotlinx.serialization.json.internal.JsonDecodingException: Expected start of the object '{', but had 'EOF' instead
    JSON input: .....xxx","columnSix":1,"columnSeven":1,"columnEight":""}]}]

为什么 Room 使用了错误的 TypeConverter?

如果我在@Database抽象 class 中没有提及 Single instance TypeConverter,我会收到构建错误。

更新 2

如果我将 DAO fetchMap方法返回类型更改为Map<String, List<Any>>

现在 Room 使用了正确的类型转换器,我可以获取 map ok

更新 3经过进一步测试,我发现虽然我没有遇到任何崩溃或构建问题,但我的 DAO 没有按我的要求工作。 虽然我插入了org.my.MyDataVO的多个条目列表,但我的 fetchMap function 返回的列表只包含一个条目。 为什么 Room 不能返回存储在 DB 表中的完整列表?

为什么 Room 不能返回存储在 DB 表中的完整列表?

简而言之,您不能直接将列作为列表/数组。

所以@ColumnInfo(name = "column_b") val columnB: List<org.my.MyDataVO>不起作用。

添加一个 POJO,例如

data class MyDataVOListHolder(
    val myDataVOListHolder: List<org.my.MyDataVO>
)

然后将 POJO 用于列类型,例如

@ColumnInfo(name = "column_b") val columnB: MyDataVOListHolder

显然,您将需要合适的类型转换器来将 myDataVOListHolder 转换为 Room 可以处理的类型(例如 JSON 字符串)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM