[英]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_b
到List<org.my.MyDataVO>
更新
我设法通过将我所有的 TypeConverters 添加到@Database
抽象 class 定义来解决构建错误
但是我现在面临一个运行时错误,这看起来很奇怪
我有org.my.MyDataVO
和List<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.