android - @Ignore 和不可变字段的问题

标签 android kotlin android-room

我的房间有问题。

我正在使用带有 Gson 转换器的改造作为其余 api,我想与房间分享 pojos。一般来说它可以工作,但在某些情况下我需要忽略一些字段,因为我有对象列表。我尝试使用 @Ignore 注释,但使用它构建过程失败并出现以下错误:

error: Entities and Pojos must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type). public final class Service {

^ error: Cannot find setter for field. private final java.lang.String id = null;

^ error: Cannot find setter for field. private final java.lang.String name = null;

^ error: Cannot find setter for field. private final java.lang.String description = null;



所以,使用这个类,一切正常:
@Entity(tableName = "services")
data class Service(

    @PrimaryKey val id: String,
    val name: String,
    val description: String,
    val parentId: String?
)

有了这个,失败:
@Entity(tableName = "services")
data class Service(

    @PrimaryKey val id: String,
    val name: String,
    val description: String,
    val parentId: String?,
    @Ignore val test: String
)

我正在使用这个版本的房间:
implementation 'androidx.room:room-runtime:2.1.0-alpha06'
kapt 'androidx.room:room-compiler:2.1.0-alpha06'

我知道可以使用 var 而不是 val 并添加辅助构造函数来解决问题,但我不想这样做,我更喜欢保留我的字段的不可变状态。

它是忽略注释的错误吗?为什么没有它一切正常?
任何帮助表示赞赏:)

最佳答案

在您的第二个示例中,Service 将被转换为一个 Java 类,该类具有一个带有四个参数的构造函数。 Room 看到 @Ignore 注释并知道它需要绑定(bind) 3 个字段,因此它需要一个带有 3 个参数的构造函数与这些字段类型匹配。因为它没有找到这样的构造函数(或默认构造函数),所以它失败了。

尝试将最后一个属性设为可选并在构造函数上使用 @JvmOverloads 注释:

@Entity(tableName = "services")
data class Service @JvmOverloads constructor(
    @PrimaryKey val id: String,
    val name: String,
    val description: String,
    val parentId: String?,
    @Ignore val test: String? = null
)

这将使 Kotlin 编译器生成一个 3 参数构造函数并使 Room 再次快乐。

I'm using retrofit with Gson converter for the rest api, and I'd like to share the pojos with room.



您可能应该避免这样做,并使用两组类来对 API 响应和数据库数据进行建模。即使在最初的那一刻,您也需要进行一些“修改”以使一切正常运行,如果将来 API 或数据库发生更改,您需要在更多地方进行更复杂的更改。

关于android - @Ignore 和不可变字段的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55358675/

相关文章:

android - 如何在android中使用数据库数据在canvas上绘图

android - 来自json的Arraylist,并在Kotlin的recyclerView中使用它

在 Flowable 中使用方法引用时,Kotlin 无法推断类型

java - 可以在 Room 数据库的构造函数中使用 @Ignore 字段吗?

android - 滚动到项目

android - 启动一个 Activity 需要多长时间?

java - Android服务停止,内存和以前一样

android - 如何使用接口(interface)android在适配器中创建onclick事件?

java - Android Room - 处理对象中的对象列表和查询结果

android - 使用 LiveData 检查 RoomDatabase 是否为空