Aller au contenu

Créer l'entité Word

Les données de cette application sont des mots, et vous aurez besoin d'une table simple pour stocker ces valeurs :

Word table diagram

Les composants d'architecture vous permettent de créer une table via une entité (Entity). Faisons-le maintenant.

2.1 Créer la classe Word

  1. Effectuez un clic droit sur app > java > com.example.enetcom.roomwordsample, puis sélectionnez New > Package.
  2. Saisissez model comme dernière partie du nom du package.
  3. Effectuez un clic droit sur le package model, puis sélectionnez New > Kotlin Class/File.
  4. Saisissez Word comme nom et sélectionnez Class. Cette classe décrira l'entité (qui représente la table SQLite) pour vos mots. Chaque propriété de la classe représente une colonne de la table. Room utilisera ces propriétés pour créer la table et instancier des objets à partir de lignes de la base de données. Voici le code :

    model/Word.kt
    data class Word(val word: String)
    

Classe de données Kotlin

Le mot-clé data class demande à Kotlin de générer automatiquement les fonctions equals(), hashCode(), toString() et copy(). Par ailleurs, la propriété val word, déclarée directement dans le constructeur, génère automatiquement l'accesseur getWord() dont Room a besoin : il n'y a donc plus de code répétitif à écrire.

2.2 Annoter la classe Word

Pour que la classe Word ait un sens pour une base de données Room, vous devez l'annoter. Les annotations identifient la manière dont chaque partie de cette classe se rapporte à une entrée dans la base de données. Room utilise ces informations pour générer du code.

Mettez à jour votre classe Word avec des annotations comme indiqué dans ce code. Comparez-le au schéma de la table : chaque annotation correspond à un élément du schéma.

model/Word.kt
1
2
3
4
5
6
@Entity(tableName = "word_table") // (1)!
data class Word(
    @PrimaryKey // (2)!
    @ColumnInfo(name = "word") // (3)!
    val word: String // (4)!
)
  1. Nom de la table : la table SQLite s'appelle word_table.
  2. Primary Key (clé primaire) : la colonne word identifie chaque ligne de la table de manière unique.
  3. Nom de la colonne : la colonne s'appelle word.
  4. Type de donnée : String (type non nullable) correspond à une colonne de type TEXT NOT NULL.

Imports automatiques

Lorsque vous copiez et collez du code, vous devrez peut-être importer les classes d'annotation manuellement. Vous pouvez placer le curseur sur le code de chaque erreur et utiliser le raccourci clavier Project quick fix (Alt+Entrée sur Windows/Linux, Option+Entrée sur Mac) pour importer les classes rapidement :

  • import androidx.room.ColumnInfo
  • import androidx.room.Entity
  • import androidx.room.PrimaryKey

Notez que si vous tapez les annotations vous-même (au lieu de les coller), Android Studio les importera automatiquement.

Voyons ce que font ces annotations :

  • @Entity(tableName = "word_table") : Chaque classe @Entity représente une table SQLite. Annotez la déclaration de votre classe pour indiquer qu'il s'agit d'une entité. Vous pouvez spécifier le nom de la table si vous souhaitez qu'il soit différent du nom de la classe. Ici, nous nommons la table "word_table".
  • @PrimaryKey : Chaque entité a besoin d'une clé primaire. Pour simplifier les choses, chaque mot agit comme sa propre clé primaire.
  • @ColumnInfo(name = "word") : Spécifie le nom de la colonne dans la table si vous souhaitez qu'il soit différent du nom de la propriété. Ici, les deux noms sont identiques : l'annotation est donc facultative, mais elle rend le mappage explicite.
  • Type non nullable : en Kotlin, le type String (sans ?) ne peut jamais valoir null. Room crée donc la colonne avec la contrainte NOT NULL, sans qu'il soit nécessaire d'ajouter l'annotation @NonNull utilisée en Java.
  • Chaque propriété stockée dans la base de données doit être accessible par Room (publique, ou dotée d'un « getter »). Cet exemple fournit automatiquement un accesseur getWord() grâce à la propriété val word.

Vous trouverez une liste complète des annotations dans la référence du package Room.

Génération automatique de clés

Vous pouvez générer automatiquement (autogenerate) des clés uniques en annotant la clé primaire de la manière suivante :

1
2
3
4
5
6
@Entity(tableName = "word_table")
data class Word(
    @PrimaryKey(autoGenerate = true)
    val id: Int = 0, // (1)!
    val word: String
)
  1. La valeur par défaut 0 indique à Room de générer lui-même l'identifiant lors de l'insertion.

Vous utiliserez la génération automatique dans la deuxième partie du codelab.