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

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

【问题讨论】:

  • 复合主键与 MVVM 有什么关系?
  • 是的 CommonsWare 这两个都是独立的。感谢您指出,我会修改我的问题。

标签: android android-room


【解决方案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 stackoverflow.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否则会给你一个编译时错误,如谷歌开发者网站上所述。 希望,这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-10-19
      • 2021-04-24
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 2014-04-22
      • 2021-10-30
      • 1970-01-01
      相关资源
      最近更新 更多