gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:21:21 26 4
gpt4 key购买 nike

我的房间有问题。

我正在使用带有 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com