Android Room查询返回LiveData<List<String>>报Cursor转换错误
问题现象
使用Java编写Android Room数据库表查询逻辑时,会触发如下编译报错:
error: Not sure how to convert a Cursor to this method's return type (java.lang.String). LiveData<List
>
触发报错的原有查询代码:
@Query("SELECT timeStamp FROM myTable") LiveData<List<String>> getAllTimeStamps();
实际测试发现,当List的泛型为自定义实体类时,不会触发该错误;将查询语句改为显式类型转换写法后,功能可正常运行。
问题原因
Room做查询结果映射时,如果返回值是基础类型、字符串这类单值类型的集合,要求查询返回的列类型必须和声明的Java类型严格匹配,不会自动做跨类型的隐式转换。
这个报错的核心诱因是myTable表中timeStamp列的存储类型不是TEXT,和方法声明的返回值String类型不匹配,Room无法自动将游标中读取到的该列值转换为String实例,因此抛出转换异常。
当返回值是自定义实体类的集合时,Room会按照实体类中字段声明的类型和表列做绑定映射,走实体类字段的内置转换逻辑,因此不会触发这类类型不匹配错误。
解决方案
- 在SQL查询语句中把
timeStamp列显式转换为TEXT类型即可,该写法已验证可正常运行,代码如下:
@Query("SELECT CAST(timeStamp AS TEXT) FROM myTable") LiveData<List<String>> getAllTimeStamps();
- 如果
timeStamp在业务设计上本身就是存储字符串内容的字段,也可以直接核对myTable对应实体类中timeStamp字段的声明,将其类型修改为String,后续查询不需要额外写CAST转换就能正常运行。
内容的提问来源于stack exchange,提问作者Girish Garg
相关产品推荐
相关产品推荐

