如何在使用 Room 时在 Kotlin 中扩展 class?
How to extend class in Kotlin while using Room?
我有两个数据 class Product
和 ProductInfo
,ProductInfo
是 Product
的扩展,但是应该如何在 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。
我有两个数据 class Product
和 ProductInfo
,ProductInfo
是 Product
的扩展,但是应该如何在 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。