如何在房间中制作复合键

Posted

技术标签:

【中文标题】如何在房间中制作复合键【英文标题】:How to make composite key in Room 【发布时间】:2018-04-18 05:22:54 【问题描述】:

我刚刚在房间里找到了@PrimaryKey 注释。那么如果我想制作复合键,我该怎么做呢?

【问题讨论】:

复合主键与 MVVM 有什么关系? 是的 CommonsWare 这两个都是独立的。感谢您指出,我会修改我的问题。 【参考方案1】:

使用primaryKeys()

android Developer Documentation 代表Room 状态:

如果在 Embeddedd 字段上使用 PrimaryKey 注释,则所有列 从该嵌入字段继承成为复合主键 (包括它的大子字段)。

Java 中的示例实现:

@Entity(primaryKeys = "column1","column2","column3")
public class DummyClass 
    ...

kotlin 中的示例实现:

@Entity(primaryKeys = ["column1","column2","column3"])
class DummyClass 
    ...

感谢Lalit Kushwah 提供的示例。

【讨论】:

谢谢它成功了,如果有人需要,我在这里分享实现:@Entity (primaryKeys = "column1","column2") 这是创建复合主键的例子吗??【参考方案2】:

以下是 Kotlin 的示例:

import android.arch.persistence.room.Entity

@Entity(primaryKeys= [ "first_name", "last_name" ] )
class User
    .......

【讨论】:

如何将其中之一设为autogenerate = true @WahibUlHaq ***.com/questions/46790830/… 这可能会回答你的问题 使用 '' 而不是 '[' 我认为对于 java 你需要 而对于 kotlin 你需要 [【参考方案3】:

这对我有用,我认为我使用的是 Kotlin 1.3。

@Entity(tableName = "location_table", primaryKeys = ["lat", "lon"])
    data class MyLocation(
    //    @PrimaryKey(autoGenerate = true) var id: Long?,
        var lat: Double,
        var lon: Double,
        var dateTime: String,
        var weatherDescription: String,
        var temperature: Double
    )

【讨论】:

【参考方案4】:

您可以在现有实体类之上声明一个实体,例如以下

@Entity
 (tableName = "Equipment_History", primaryKeys = "EquipName","EquipFunctionalLocation")
public class EquipmentHistory 

    @ColumnInfo @NonNull
    private String EquipFunctionalLocation;
    @ColumnInfo @NonNull
    private String EquipName;
//rest of the columns 


通过这种方式,您可以拥有自己选择的表名,也可以在 room 中声明复合主键,但请确保在 @ColumnInfo 注释旁边添加 @NonNull 注释,否则代码将无法工作,因为 room否则会给你一个编译时错误,如谷歌开发者网站上所述。 希望,这会有所帮助。

【讨论】:

以上是关于如何在房间中制作复合键的主要内容,如果未能解决你的问题,请参考以下文章

如何自动创建精灵并在房间中垂直移动它们?游戏制作者开发者

如何在 Java 中的 Cassandra 中注释/使用复合分区键?

如何在 mongoDB 中创建复合唯一键

如何在hibernate中定义复合外键映射?

Android房间复合主键,排序顺序

如何在 Sequelize 中使用外键和常规键创建复合唯一约束?