Aller au contenu

Tâche 6 : Supprimer des mots de la base de données

Pour implémenter la fonctionnalité de suppression, vous devez :

  • Implémenter la méthode delete() dans WordListOpenHelper
  • Ajouter un gestionnaire de clic au bouton DELETE dans WordListAdapter

1. Écrire la méthode delete()

Vous utilisez la méthode delete() sur SQLiteDatabase pour supprimer une entrée dans la base de données. Ajoutez une méthode delete à WordListOpenHelper qui :

  1. Créez le stub de méthode pour delete(), qui prend un argument int pour l'id de l'élément à supprimer et renvoie le nombre de lignes supprimées.

    public int delete(int id) {}
    
  2. Déclarez une variable pour contenir le résultat.

    int deleted = 0;
    
  3. Comme pour l'insertion, ajoutez un bloc try.

    try {} catch (Exception e) {}
    
  4. Obtenir une base de données accessible en écriture, si nécessaire.

    1
    2
    3
    if (mWritableDB == null) {
        mWritableDB = getWritableDatabase();
    }
    
  5. Appeler delete sur WORD_LIST_TABLE, en sélectionnant par KEY_ID et en passant la valeur de l'id comme argument. Le "?" est un espace réservé qui est rempli avec la chaîne. C'est une manière plus sûre de construire des requêtes.

    deleted = mWritableDB.delete(WORD_LIST_TABLE,
        KEY_ID + " = ? ", new String[]{String.valueOf(id)});
    
  6. Afficher un message de journal pour les exceptions.

    Log.d (TAG, "DELETE EXCEPTION! " + e.getMessage());
    
  7. Renvoyer le nombre de lignes supprimées.

    return deleted;
    
Solution O_O
public int delete(int id) {
    int deleted = 0;
    try {
        if (mWritableDB == null) {
            mWritableDB = getWritableDatabase();
        }
        deleted = mWritableDB.delete(WORD_LIST_TABLE, //nom de la table
                KEY_ID + " =? ", new String[]{String.valueOf(id)});
    } catch (Exception e) {
        Log.d (TAG, "DELETE EXCEPTION! " + e.getMessage());
    }
    return deleted;
}

2. Ajouter un gestionnaire de clics au bouton `DELETE

Vous pouvez maintenant ajouter un gestionnaire de clics au bouton DELETE qui appelle la méthode delete() que vous venez d'écrire.

Jetez un œil à la classe MyButtonOnClickListener dans votre code de démarrage. La classe MyButtonOnClickListener implémente un écouteur de clics qui stocke l'identifiant et le mot dont vous avez besoin pour apporter des modifications à la base de données.

Chaque élément de vue, lorsqu'il est attaché (lié) à la vue RecyclerView dans la méthode onBindViewHolder de WordListAdapter, doit également attacher un écouteur de clic au bouton DELETE, en transmettant l'ID et le mot au constructeur MyButtonOnClickListener. Ces valeurs sont ensuite utilisées par le gestionnaire onClick pour supprimer l'élément concerné et notifier l'adaptateur de la suppression.

Notez que l'argument position passé à onBindViewHolder ne peut pas être utilisé, car il risque d'être obsolète au moment de l'appel du gestionnaire de clic. Vous devez conserver une référence à l'élément de vue et récupérer sa position avec getBindingAdapterPosition().

Solution O_O
// Conserver une référence au détenteur de la vue pour l'écouteur de clic
final WordViewHolder h = holder ; // doit être final pour être utilisé dans le rappel

// Attacher un écouteur de clic au bouton SUPPRIMER.
holder.delete_button.setOnClickListener(
    new MyButtonOnClickListener(current.getId(), null) {

        @Override 
        public void onClick(View v ) { 
            int deleted = mDB.delete(id); 
            if (deleted >= 0) 
                notifyItemRemoved(h.getBindingAdapterPosition()); 
        } 
        }); 

Félicitations !

Vous avez complété la tâche 6. Vous avez implémenté la méthode delete() dans WordListOpenHelper et ajouté un gestionnaire de clic au bouton DELETE dans WordListAdapter. N'oubliez pas de committer sur la branche tp-sqlite de votre dépot git local.