如何在使用 Room 时在 Kotlin 中扩展 class?

How to extend class in Kotlin while using Room?

我有两个数据 class ProductProductInfoProductInfoProduct 的扩展,但是应该如何在 Kotlin 中使用房间好像我尝试在产品上使用 interface 而不是 data class 我无法设置 @PrimaryKey 注释?

@Entity(tableName = "articoli")
data class Articoli (
    @PrimaryKey
    var codiceArticolo: String,
    var descrizione: String,
    var prezzoVendita: Float,
    var prezzoAcquisto: Float,
    var unitaMisura: String,
)

data class InfoArticoli(
    var codiceArticolo: String,
    var descrizione: String,
    var prezzoVendita: Float,
    var prezzoAcquisto: Float,
    var unitaMisura: String,
    var giacenza: List<String>,
    var famiglia: String,
    var reparto: String,
    var repartoCassa: String,
    var scortaMinima: String,
    var iva: String,
    var fornitore: String,
)

回答您的第一个问题“如果我尝试在产品上使用接口而不是数据 class,我将无法设置 @PrimaryKey 注释?”不是,因为 Room 使用 classes 来存储您的数据,接口仅用于定义某些 classes 的行为。

我不太确定您所说的“扩展”一词是什么意思,但我看到您的问题有两种不同的处理方法。

首先你可以使用继承概念在你的产品中建立一些行为或一些变量,并在你的产品信息中定义其他部分

@Entity(tableName = "queue")
public class Queue {
  int id;
  String name;
  int type;
  int status;
}

@Entity(tableName = "production_queue")
public class ProductionQueue extends Queue {
    ...
}

第二种方法是使用 link 两个 table 房间的外键

@Entity(foreignKeys = arrayOf(ForeignKey(entity = ParentClass::class,
                    parentColumns = arrayOf("parentClassColumn"),
                    childColumns = arrayOf("childClassColumn"),
                    onDelete = ForeignKey.CASCADE)))

在这种方法中,Product 和 InfoProduct 是两个不同的 classes link,具有一个值

可以使用@Entity注解的primaryKeys参数来指定具体的主键。

我怀疑你想要的是:-

data class Articoli (
    var codiceArticolo: String,
    var descrizione: String,
    var prezzoVendita: Float,
    var prezzoAcquisto: Float,
    var unitaMisura: String,
)

@Entity(tableName = "articoli", primaryKeys = ["codiceArticolo"])
data class InfoArticoli(
    @Embedded
    var articoli: Articoli,
    var giacenza: List<String>,
    var famiglia: String,
    var reparto: String,
    var repartoCassa: String,
    var scortaMinima: String,
    var iva: String,
    var fornitore: String,
)
  • @Embedded 有效地扩展了 Articoli
  • 注意到您将遇到 giacenza 的持续问题,因为您需要类型转换器或从数据库的角度来看 giacenza 列表 table。