66

I have just found @PrimaryKey annotation in room. So If I want to make composite key so how can I do that?

Ridcully
  • 23,362
  • 7
  • 71
  • 86
Lalit Kushwah
  • 3,861
  • 5
  • 25
  • 40

4 Answers4

122

Make use of primaryKeys().

Android Developer Documentation for Room states:

If PrimaryKey annotation is used on a Embeddedd field, all columns inherited from that embedded field becomes the composite primary key (including its grand children fields).

Example implementation in Java:

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

Example implementation in kotlin:

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

Thanks Lalit Kushwah for the example.

Abhinav Atul
  • 601
  • 6
  • 14
Sneh Pandya
  • 8,197
  • 7
  • 35
  • 50
31

Here is an example for Kotlin:

import android.arch.persistence.room.Entity

@Entity(primaryKeys= [ "first_name", "last_name" ] )
class User{
    .......
}
Rautermann
  • 334
  • 3
  • 10
Prakash
  • 7,794
  • 4
  • 48
  • 44
9

This worked for me I'm using Kotlin 1.3, I think.

@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
    )
Matt Bussing
  • 556
  • 6
  • 10
4

You can declare an entity on top of your existing entity class such as following

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

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

}

In this way you can have the table name of your own choice and also can declare a composite primary key in room but make sure you add the @NonNull annotation alongside your @ColumnInfo annotation otherwise the code won't work, because room will give you a compile-time error otherwise as stated on the google developers website. Hope, this will help.

usman malik
  • 91
  • 1
  • 3