Je crée une classe Food Entity (Room Persistence lib), où je veux créer une foodId
auto-incrémentation.
@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 d'auto-incrémentation?
android
kotlin
android-room
chandil03
la source
la source
0.toDouble()
vous pouvez utiliser0.0
do le déclarer comme un doubleRéponses:
Vous devez utiliser la
autoGenerate
propriétéVotre annotation de clé primaire doit ressembler à ceci:
Référence pour PrimaryKey .
la source
@Entity( primaryKeys = arrayOf(COLUMN_ID_LOCAL,COLUMN_ID_REMOTE))
?Insert methods treat 0 as not-set while inserting the item.
Vous pouvez ajouter
@PrimaryKey(autoGenerate = true)
comme ceci:la source
foodId
n'a pas besoin d'être nul (mais cela 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.int
oulong
, 0 est traité comme nullable, lorsque le type est Integer ou Long, null est le nullable. Puisque Kotlin Int quand non-nullable fonctionne dans JVM comme int primitif, alors vous avez raison etvar foodId: Int = 0
fonctionnera, maisvar foodId: Int? = 0
ne fonctionnera pas depuis Int? est converti dans JVM en tant qu'Integer. @JMK, si vous le rendez 0, vous DEVEZ rendre un non-nullableint
pour la raison mentionnée ci-dessus.val jack = User(name = "Jack", phone= 1)
Dans ce cas, vous pouvez supprimer 0 du constructeurfoodId
été mis dans le corps et non dans le constructeur?ajouter
@PrimaryKey(autoGenerate = true)
lors du stockage des données
type 2
Mettre null ou zéro pour l'id lors de la création de l'objet (objet utilisateur de mon cas)
Si le type de champ est long ou int (ou si son TypeConverter le convertit en long ou int), les méthodes Insert traitent 0 comme non défini lors de l'insertion de l'élément.
Si le type du champ est Integer ou Long (Object) (ou si son TypeConverter le convertit en Integer ou Long), les méthodes Insert traitent null comme non défini lors de l'insertion de l'élément.
la source
val jack = User(name = "Jack", phone= 1)
Dans ce cas, vous pouvez supprimer 0 du constructeurla source
@PrimaryKey(autoGenerate = true)
» - votre réponse ajoute-t-elle quelque chose de nouveau à ce fil?Par exemple, si vous avez une
users
entité que vous souhaitez stocker, avec des champs(firstname, lastname , email)
et que vous souhaitez un identifiant généré automatiquement, procédez ainsi.Room génère alors et incrémente automatiquement le
id
champ.la source
@PrimaryKey(autoGenerated = true) val id: Long? = null
dehors du constructeur, sur le corps de la classeAnnotez votre classe Entity avec le code ci-dessus.
En Java
À Kotlin
Room générera alors et incrémentera automatiquement le champ ID.
la source