2017-05-22 4 views
28

Je crée une classe Entity (Room Persistence lib) Food, où je veux créer foodId comme autoincrement.Comment créer une clé primaire comme autoincrément pour la persistance de la pièce lib

@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() 
} 

Comment puis-je définir foodId un champ auto-incrémenté?

+2

au lieu de '0.toDouble()' 'vous pouvez utiliser 0.0' ne déclarerons comme deux – RobCo

+0

Comment vous créez une nouvelle instance de classe alimentaire? Est-ce que vous spécifiez l'ID manuellement ou vous le laissez vide? – Zookey

Répondre

71

Vous devez utiliser la autoGenerate propriété

Votre annotation clé primaire devrait être comme ceci:

@PrimaryKey(autoGenerate = true) 

Référence here

+2

Merci, je cherchais autoIncrement, c'est pourquoi n'a pas pu trouver. – chandil03

+0

Hey @MatPag Que faire si je veux deux clés primaires dans une table (clés primaires composites) et l'un de la clé primaire devrait être incrémenté automatiquement? Comment puis-je y parvenir? Pouvez-vous répondre à cette question [ici] (https://stackoverflow.com/questions/46790830/how-to-make-primary-key-auto-increment-while-using-composite-primary-keys-in-roo)? –

+0

@MatPeg Dans le cas où je veux avoir un PrimaryKey le est auto-généré, et celui qui vient de REST '@Entity ( primaryKeys = arrayOf (COLUMN_ID_LOCAL, COLUMN_ID_REMOTE))'? – murt

1

Par exemple, si vous avez une entité users vous voulez stocker , avec les champs (firstname, lastname , email) et vous voulez l'ID autogénéré, vous faites cela.

@Entity(tableName = "users") 
data class Users(
    @PrimaryKey(autoGenerated = true) 
    val id: Long, 
    val firstname: String, 
    val lastname: String, 
    val email: String 
) 

Chambre sera alors autogenerate et auto-increment le champ id.

+9

Chaque fois que nous créons un nouvel objet Utilisateurs, nous devons passer un champ d'identification. Cela peut-il être évité? –

+2

Oui, mettez '@PrimaryKey (autoGenerated = true) val id: Long? = null' en dehors du constructeur, sur le corps de la classe – Magritte

10

Vous pouvez ajouter @PrimaryKey(autoGenerate = true) comme ceci:

@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? = null // foodId needs to be null otherwise autoGenerate will not work and Room will use the id assigned to it 
    var calories: Double = 0.toDouble() 
} 
+0

'foodId' n'a pas besoin d'être nul (mais ça peut l'être). On pourrait également utiliser des valeurs par défaut, par exemple. 'var foodId: Int = 0' et l'autogénération fonctionnerait correctement. –