Hoe maak je een primaire sleutel als auto-increment voor Room Persistence lib

Ik maak een Entity (Room Persistence Library) class Food, waar Ik wil foodIdmaken als autoincrement.

@Entity
class Food(var foodName: String, var foodDesc: String, var protein: Double, var carbs: Double, var fat: Double)
{
    @PrimaryKey
    var foodId: Int = 0
    var calories: Double = 0.toDouble()
}

Hoe kan ik foodIdeen autoincrement-veld instellen?


Antwoord 1, autoriteit 100%

U moet de eigenschap autoGenerategebruiken

Uw primaire sleutelannotatie zou er als volgt uit moeten zien:

@PrimaryKey(autoGenerate = true)

Referentie voor PrimaryKey.


Antwoord 2, autoriteit 36%

Je kunt @PrimaryKey(autoGenerate = true)als volgt toevoegen:

@Entity
data class Food(
        var foodName: String, 
        var foodDesc: String, 
        var protein: Double, 
        var carbs: Double, 
        var fat: Double
){
    @PrimaryKey(autoGenerate = true)
    var foodId: Int = 0 // or foodId: Int? = null
    var calories: Double = 0.toDouble()
}

Antwoord 3, autoriteit 13%

voeg @PrimaryKey(autoGenerate = true)

@Entity
public class User {
    @PrimaryKey(autoGenerate = true)
    private int id;
    @ColumnInfo(name = "full_name")
    private String name;
    @ColumnInfo(name = "phone")
    private String phone;
    public User(){
    }
    //type-1
    public User(String name, String phone) {
        this.name = name;
        this.phone = phone;
    }
    //type-2
    public User(int id, String name, String phone) {
        this.id = id;
        this.name = name;
        this.phone = phone;
    }
}

tijdens het opslaan van gegevens

//type-1
 db.userDao().InsertAll(new User(sName,sPhone)); 
 //type-2
 db.userDao().InsertAll(new User(0,sName,sPhone)); 

type-1

Als u geen waarde voor de primaire sleutel doorgeeft, is deze standaard 0 of
null.

type-2

Zet null of nul voor de idtijdens het maken van een object (mijn case-gebruikersobject)

Als het veldtype long of int is (of de TypeConverter converteert het naar long of int), behandelen invoegmethoden 0 als niet-set tijdens het invoegen van het item.

Als het type van het veld Integer of Long (Object) is (of de TypeConverter ervan converteert naar een Integer of Long), behandelen de Insert-methoden null als niet-set tijdens het invoegen van het item.


Antwoord 4, autoriteit 9%

Het is ongelooflijk na zoveel antwoorden, maar ik deed het uiteindelijk een beetje anders. Ik vind het niet leuk dat de primaire sleutel nullable is, ik wil het als eerste argument hebben en ook invoegen zonder het te definiëren en het mag ook geen var zijn.

@Entity(tableName = "employments")
data class Employment(
    @PrimaryKey(autoGenerate = true) val id: Long,
    @ColumnInfo(name = "code") val code: String,
    @ColumnInfo(name = "title") val name: String
){
    constructor(code: String, name: String) : this(0, code, name)
}

Antwoord 5, autoriteit 4%

Dit werkt voor mij:

@Entity(tableName = "note_table")
data class Note(
    @ColumnInfo(name="title") var title: String,
    @ColumnInfo(name="description") var description: String = "",
    @ColumnInfo(name="priority") var priority: Int,
    @PrimaryKey(autoGenerate = true) var id: Int = 0//last so that we don't have to pass an ID value or named arguments
)

Merk op dat de ID het laatst is om te voorkomen dat u de naam argumenten moet gebruiken bij het maken van de entiteit, voordat u het in de kamer plaatst. Zodra het is toegevoegd aan de kamer, gebruik dan de ID bij het bijwerken van de entiteit.

Other episodes