How to make composite key in Room

AndroidAndroid Room

Android Problem Overview


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

Android Solutions


Solution 1 - Android

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.

Solution 2 - Android

Here is an example for Kotlin:

import android.arch.persistence.room.Entity

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

Solution 3 - Android

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
    )

Solution 4 - Android

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionLalit KushwahView Question on Stackoverflow
Solution 1 - AndroidSneh PandyaView Answer on Stackoverflow
Solution 2 - AndroidPrakashView Answer on Stackoverflow
Solution 3 - AndroidMatt BussingView Answer on Stackoverflow
Solution 4 - Androidusman malikView Answer on Stackoverflow