Aller au contenu

Tâche 7 : Mettre à jour les mots dans la base de données

Pour mettre à jour les mots existants, vous devez :

  • Ajouter une méthode update() à WordListOpenHelper.
  • Ajouter un gestionnaire de clic au bouton EDIT de votre vue.

1. Écrire la méthode update()

Vous utilisez la méthode update() sur SQLiteDatabase pour mettre à jour une entrée existante dans la base de données.

  1. Ajoutez une méthode à WordListOpenHelper qui :

  2. Prend un identifiant entier et un mot String pour ses arguments et renvoie un entier.

    public int update(int id, String word)
    
  3. Initialise int mNumberOfRowsUpdated à -1.

    int mNumberOfRowsUpdated = -1;
    
  4. Dans un bloc try, procédez comme suit :

    1. Obtenez une base de données SQLiteDatabase accessible en écriture s'il n'y en a pas déjà une.

      1
      2
      3
      if (mWritableDB == null) {
          mWritableDB = getWritableDatabase();
      }
      
    2. Créez une nouvelle instance de ContentValues et ajoutez-lui le mot KEY_WORD.

      ContentValues ​​values ​​= new ContentValues();
      values.put(KEY_WORD, word);
      
    3. Appelez db.update en utilisant les arguments suivants :

      1
      2
      3
      4
      5
      6
      mNumberOfRowsUpdated = db.update(WORD_LIST_TABLE,
          values, // nouvelles valeurs à insérer
          // critères de sélection pour la ligne (la colonne _id)
          KEY_ID + " = ?",
          // arguments de sélection ; valeur de l'id
          new String[]{String.valueOf(id)});
      
  5. Dans le bloc catch, imprimez un message de journal si des exceptions sont rencontrées.

    Log.d (TAG, "UPDATE EXCEPTION: " + e.getMessage());
    
  6. Renvoie le nombre de lignes mises à jour, qui doit être -1 (échec), 0 (rien de mis à jour) ou 1 (succès).

    return mNumberOfRowsUpdated;
    
Solution O_O
public int update(int id, String word) {
    int mNumberOfRowsUpdated = -1;
    try {
        if (mWritableDB == null) {
            mWritableDB = getWritableDatabase();
        }
        ContentValues ​​values ​​= new ContentValues();
        values.put(KEY_WORD, word);
        mNumberOfRowsUpdated = mWritableDB.update(WORD_LIST_TABLE,
                values,
                KEY_ID + " = ?",
                new String[]{String.valueOf(id)});
    } catch (Exception e) {
        Log.d (TAG, "UPDATE EXCEPTION! " + e.getMessage());
    }
    return mNumberOfRowsUpdated;
}

2. Ajouter un écouteur de clic au bouton EDIT

Et voici le code de l'écouteur de clic Modifier lorsque nous lions la Vue dans la méthode onBindViewHolder de WordListAdapter. Cet écouteur n'a rien de spécifique à la base de données. Il démarre l'activité EditWordActivity à l'aide d'un Intent et lui transmet l'ID, la position et le mot actuels dans les Extras.

Si vous obtenez une erreur sur la constante EXTRA_POSITION, ajoutez-la avec une valeur de "POSITION",

Solution O_O
// Attachez un écouteur de clic au bouton EDIT.
holder.edit_button.setOnClickListener(new MyButtonOnClickListener(
        current.getId(), current.getWord()) {

    @Override 
    public void onClick(View v) {
        Intent intent = new Intent(mContext, EditWordActivity.class); 

        intent.putExtra(EXTRA_ID, id); 
        intent.putExtra(EXTRA_POSITION, h.getBindingAdapterPosition()); 
        intent.putExtra(EXTRA_WORD, word); 

        // Démarrer une activité d'édition vide. 
        ((Activity) mContext).mEditWordActivityLauncher.launch(intent);
}
});

3. Ajouter la mise à jour à onActivityResult

Tel qu'implémenté, cliquer sur le bouton EDIT démarre une activité qui montre à l'utilisateur le mot actuel, et il peut le modifier. Pour effectuer la mise à jour,

  1. Ajoutez une ligne de code à la méthode onActivityResult dans votre MainActivity.

    1
    2
    3
    else if (id >= 0) {
        mDB.update(id, word);
    }
    
  2. Exécutez votre application et jouez avec

4. Considérations relatives à la conception et aux erreurs

1. Validation des données

Dans ce TP, les méthodes insert(), update() et delete() sont simplifiées à des fins pédagogiques. Dans un projet réel, vous devrez :

  • Vérifier que les données entrées sont valides (non vides, format correct, etc.)
  • Protéger votre application contre les injections SQL malveillantes
  • Ajouter des contrôles de sécurité avant toute opération sur la base de données

2. Gestion des exceptions

Pour l'instant, vous utilisez un bloc catch (Exception e) générique. Dans une application professionnelle, vous devriez :

  • Intercepter des exceptions spécifiques (SQLiteException, IllegalArgumentException, etc.)
  • Gérer chaque type d'erreur de manière appropriée
  • Informer l'utilisateur des problèmes de manière claire

3. Tests de l'application

Vous avez testé votre application manuellement en l'exécutant. Pour un projet professionnel, il faudrait :

  • Créer des tests unitaires pour chaque méthode de la base de données
  • Effectuer des tests d'interface utilisateur automatisés
  • Tester tous les scénarios possibles (cas normaux et cas limites)

4. Architecture du code

Dans ce TP, tout le code de la base de données est dans SQLiteOpenHelper. Pour une application plus complexe, il est recommandé de :

  • Séparer les définitions de schéma dans une classe dédiée (contrat de base de données)
  • Organiser le code de manière plus modulaire

5. Performance et threads

Certaines opérations sur la base de données peuvent être lentes, surtout avec beaucoup de données. Pensez à :

  • Utiliser ExecutorService pour exécuter les opérations longues en arrière-plan
  • Ne jamais bloquer le thread principal (UI) avec des requêtes lourdes
  • Maintenir l'application fluide et réactive

Félicitations !

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