如何将房间自动生成的主键作为外键添加到另一个实体

Posted

技术标签:

【中文标题】如何将房间自动生成的主键作为外键添加到另一个实体【英文标题】:How to add room auto generated Primary key to another entity as a foreign key 【发布时间】:2020-12-17 00:27:01 【问题描述】:
@Entity 
data class Product (
@PrimaryKey(autoGenerate = true)
var id: Long? = null
)


data class ProductList (
   @Embedded var products: Product,
   @Relation(
            parentColumn = "id",
            entityColumn = "productId",
            entity = GroceryItem::class
    )
    var courses: List<GroceryItem?>? = null
  )


  @Entity
  data class GroceryItem (
     @PrimaryKey
     var id: Int? = null,
     var image: String? = null,
     var price: String?= null
     )

这里我没有任何常见的字段,所以我如何关联这两个表或如何将房间自动生成的 id 添加为外键

【问题讨论】:

this 有帮助吗? 不,就我而言,我没有任何公共字段@stachu 好的,如果没有公共字段,那么外键应该如何工作?在纯 SQL 中,我们暂时跳过 Room 我不明白你所说的在第二个表中添加一个表字段是什么意思。您可以做的是在第二个实体中创建一个productid 字段,并将其限制为仅从product[id] 获取值,基本上是经典的foreign key 你需要在GroceryItem 中创建一个名为productId 的新属性,dao 只会使用实体中定义的对象 【参考方案1】:

用@Insert 注解的方法可以返回一个long。这是为插入的行新生成的 ID。使用 @Update 注释的方法可以返回一个 int。这是更新的行数。

update 将尝试使用 where 子句中的主键值更新所有字段。如果您的实体尚未持久化到数据库中,则更新查询将无法找到行并且不会更新任何内容。

您可以使用@Insert(onConflict = OnConflictStrategy.REPLACE)。这将尝试插入实体,如果存在具有相同 ID 值的现有行,它将删除它并将其替换为您尝试插入的实体。请注意,如果您使用自动生成的 ID,这意味着生成的行将具有与被替换的原始 ID 不同的 ID。如果你想保留 ID,那么你必须想出一个自定义的方法来做到这一点。

所以基本上你有最近插入的项目的主键。您可以在第二个表中插入行时使用该键。

【讨论】:

明白这一点,但我想将生成的密钥添加到另一个实体。这个答案没有回答我的问题

以上是关于如何将房间自动生成的主键作为外键添加到另一个实体的主要内容,如果未能解决你的问题,请参考以下文章

如何获得mysql数据库自增长主键的值?

替换其他表中作为外键的主键

navicat内的主键和外键

怎样将ms sql的主键设置为每次自增加1

如何将自动递增的主键也用作外键?

如何将自动生成的主键复制到另一个表中