android - 房间 : related entities - usable public constructor

标签 android kotlin entities android-room android-architecture-components

为了获得与 Room 的 OneToMany 关系,我创建了一个带有 @Embedded 对象和 @Relation 的 POJO变量。

data class SubjectView(
    @Embedded
    var subject: Subject,

    @Relation(parentColumn = "idWeb", entityColumn = "subject_id", entity = Topic::class)
    var topics: List<Topic>?
)

但是在编译的时候出现了这个错误

 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)
[...]
Tried the following constructors but they failed to match:
SubjectView(biz.eventually.atpl.data.db.Subject,java.util.List<biz.eventually.atpl.data.db.Topic>) : [subject : subject, topics : null]

嗯,那个构造函数 [subject : subject, topics : null] 看起来不错???

但是,如果我使用无参数构造函数和全参数构造函数更改我的类,它确实有效。

class SubjectView() {
    @Embedded
    var subject: Subject = Subject(-1, -1, "")

    @Relation(parentColumn = "idWeb", entityColumn = "subject_id", entity = Topic::class)
    var topics: List<Topic>? = null

    constructor(subject: Subject, topics: List<Topic>?) : this() {
        this.subject = subject
        this.topics = topics
    }
}

我想知道为什么第一个(更快的)版本无法编译,因为它不是文档中显示的那样。

构造函数(数据)类中所有变量的默认参数(正如我在其他帖子中看到的那样)似乎不是强制性的?

谢谢

最佳答案

数据类如何生成构造函数有几个主题。

由于您的构造函数中有一个可为 null 的对象,因此它将生成所有可能的构造函数。这意味着它生成

constructor(var subject: Subject)
constructor(var subject: Subject, var topics: List<Topic>) 

有两种方法可以解决这个问题。第一个是预定义所有值,并使用所需的构造函数创建另一个忽略的构造函数。

data class SubjectView(
    @Embedded
    var subject: Subject,

    @Relation(parentColumn = "idWeb", entityColumn = "subject_id", entity = Topic::class)
    var topics: List<Topic> = ArrayList()
) {
 @Ignore constructor(var subject: Subject) : this(subject, ArrayList())
}

另一种方法是创建一个半填充的数据类,例如

data class SubjectView(@Embedded var subject: Subject) {
    @Relation var topics: List<Topic> = ArrayList()
}

注意第一个解决方案是正确的解决方案,您需要将@Ignore 设置为任何其他构造函数。

关于android - 房间 : related entities - usable public constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46956109/

相关文章:

android - Android 上的 Youtube API Player 每 2 秒自动暂停一次

android - 如何使用 Compose 渲染普通的 android ProgressBar?

domain-driven-design - 在 DDD 中,值​​对象的实际优势是什么?

苹果手机 : NSXMLParser fails to identify HTML special entity &amp;

gradle - 错误 : cannot find symbol class for add kotlin class into java class in android studio 3. 0 稳定

android - 使用greendao for android的多对多编译错误

android - Android 中的幻灯片

android - 在android服务器上以多部分文件形式上传jpeg格式的图像

android - 扩展 Android edittext 扩展到屏幕边缘

delegates - Kotlin 委托(delegate)更有趣