Kotlin Android Room报Cannot find setter for field错误求助
问题根源定位
你遇到的Cannot find setter for field. - value in java.lang.String报错核心来自Dao层的查询方法配置错误,次要问题存在SQL语法错误,具体修复步骤如下:
- 修正查询方法返回值
你在PixelArtCreationsDao中定义的getAllPixelArtCreations方法写了String返回类型,但SELECT * FROM PixelArts查询的是整张PixelArts表的所有记录,Room需要将查询结果映射为PixelArts实体的集合,无法自动转为String,才会抛出找不到String类对应字段setter的异常。
修改该方法代码如下:
@Query("SELECT * FROM PixelArts ") suspend fun getAllPixelArtCreations(): List<PixelArts>
后续赋值给AppData.pixelArtsData时调用toMutableList()转成可变列表即可:
AppData.pixelArtsData = AppData.db.pixelArtCreationsDao().getAllPixelArtCreations().toMutableList()
- 修正UPDATE语句语法错误
UPDATE语句的SET子句中多个字段赋值需要用逗号分隔,不能使用AND,修改updatePixelArtCreation对应的查询注解:
@Query("UPDATE PixelArts SET item_pixel_data=:pixelData, item_bitmap=:bitmap WHERE id=:pixelArtId") suspend fun updatePixelArtCreation(pixelArtId: Int, bitmap: String, pixelData: String)
- 可选补充配置(避免后续报错)
你自定义的BitmapConverter、JsonConverter类型转换器需要注册到Room数据库类上,否则后续存取特殊类型字段时会抛出异常:
在你继承RoomDatabase的PixelArtDatabase类上添加@TypeConverters注解:
@Database(entities = [PixelArts::class], version = 1) @TypeConverters(BitmapConverter::class, JsonConverter::class) abstract class PixelArtDatabase : RoomDatabase() { // 原有逻辑保留 }
内容的提问来源于stack exchange,提问作者thebluepandabear
相关产品推荐
相关产品推荐

