gpt4 book ai didi

android - Room 数据库中的@ForeignKey 和@Relation 注释有什么区别?

转载 作者:行者123 更新时间:2023-12-03 17:50:19 28 4
gpt4 key购买 nike

我无法理解这些注释之间的区别。
在我的用例中,我想在表之间创建一对多的关系。
并找到了两种选择:一种使用@ForeignKey,另一种使用@Relation

我还发现,如果我更新该行(例如使用 OnCoflictStrategy.Replace),我将丢失该行的外键,这是真的吗?

最佳答案

一个 @外键 定义一个约束(又名规则),要求子列存在于父列中。如果尝试破坏该规则,则会发生冲突(可以通过 onDelete/onUpdate 定义以各种方式处理)。

一个 @关系 用于定义在父对象中返回多个子对象(可能是外键子对象)的关系。

在这一切之下 @关系 自动(有效地)连接表并生成子对象的数量。虽然 @外键 只是影响模式(除了 onDelete/onUpdate 处理),它不会导致各个表被连接。

也许考虑以下几点:-

服务实体

@Entity(
tableName = "services"
)
class Services {

@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "services_id")
var id: Long = 0
var service_date: String = ""
var user_mobile_no: String = ""

}



服务详情实体 :-
@Entity(
tableName = "service_detail",
foreignKeys = [
ForeignKey(
entity = Services::class,
parentColumns = ["services_id"],
childColumns = ["services_id"],onDelete = ForeignKey.SET_DEFAULT
)
]
)
class ServiceDetail {

@PrimaryKey
var id: Long? = null;
var services_id: Long = 0;
@ColumnInfo(defaultValue = "1")
var service_type_id: Long = 0;

constructor()

@Ignore
constructor(services_id: Long, service_type_id: Long) {
this.services_id = services_id
this.service_type_id = service_type_id
}
}
  • 这就是说,为了添加 ServiceDetail,services_id 列的值必须是存在于 中的值。 services_id 的列服务 表,否则会发生冲突。此外,如果从 services 表中删除了一行,则 service_detail 表中引用该行的任何行也将被删除(否则该行无法从 services 表中删除)。

  • 现在考虑这个普通类(POJO),它不是一个实体(又名表):-
    class ServiceWithDetail {

    @Embedded
    var services: Services? = null

    @Relation(entity = ServiceDetail::class,parentColumn = "services_id",entityColumn = "services_id")
    var serviceDetail: List<ServiceDetail>? = null
    }

    这大致是说当您请求 ServiceWithDetail 对象然后获取服务对象以及相关 service_detail 对象的列表时

    你会有一个道,比如:-
    @Query("SELECT * FROM services")
    fun getAllServices() :List<ServiceWithDetail>

    因此,它将从服务表中获取所有服务以及相关服务(即 services_detail 中的 services_id 与正在处理的当前服务行的 services_id 相同)。

    onConflictStrategy

    更换执行以下操作:-

    When a UNIQUE or PRIMARY KEY constraint violation occurs, the REPLACE algorithm deletes pre-existing rows that are causing the constraint violation prior to inserting or updating the current row and the command continues executing normally.

    If a NOT NULL constraint violation occurs, the REPLACE conflict resolution replaces the NULL value with the default value for that column, or if the column has no default value, then the ABORT algorithm is used. If a CHECK constraint or foreign key constraint violation occurs, the REPLACE conflict resolution algorithm works like ABORT.

    When the REPLACE conflict resolution strategy deletes rows in order to satisfy a constraint, delete triggers fire if and only if recursive triggers are enabled.

    The update hook is not invoked for rows that are deleted by the REPLACE conflict resolution strategy. Nor does REPLACE increment the change counter. The exceptional behaviors defined in this paragraph might change in a future release.REPLACE



    因此,您所经历的行为的可能性。但是,这取决于更新在做什么。如果 ForeignKey(s) 的值不同,那么它们应该假设没有外键冲突,将外键值替换为新的有效值。如果外键值不变,则替换行将具有相同的外键。

    关于android - Room 数据库中的@ForeignKey 和@Relation 注释有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58518229/

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