Aller au contenu

Tâche 3 : Implémenter la méthode query() dans WordListOpenHelper

La méthode query() récupère les lignes de la base de données sélectionnées par une requête SQL.

Dans cet exemple, pour afficher les mots dans la RecyclerView, nous devons les récupérer de la base de données, un par un, selon les besoins. Le mot nécessaire est identifié par sa position dans la vue.

Ainsi, la méthode query possède un paramètre pour la position demandée et renvoie un WordItem.

1. Implémenter la méthode query()

  1. Créer une méthode query qui prend un argument de position entier et renvoie un WordItem.

    public WordItem query(int position) { 
    } 
    
  2. Construisez une requête qui ne renvoie que la n-ième ligne du résultat. Utilisez LIMIT avec position comme ligne et 1 comme nombre de lignes.

    1
    2
    3
    String query = "SELECT * FROM " + WORD_LIST_TABLE + 
                " ORDER BY " + KEY_WORD + " ASC " + 
                "LIMIT " + position + ",1"; 
    
  3. Instanciez une variable Cursor à null pour contenir le résultat de la base de données.

    Cursor cursor = null; 
    

    La SQLiteDatabase présente toujours les résultats sous la forme d'un Cursordans un format de tableau qui ressemble à une base de données SQL.

    Un curseur est un pointeur dans une ligne de données structurées. Vous pouvez le considérer comme un tableau de lignes. La classe Cursor fournit des méthodes pour déplacer le curseur dans cette structure et des méthodes pour obtenir les données des colonnes de chaque ligne.

  4. Instanciez une entrée WordItem.

    WordItem entry = new WordItem(); 
    
  5. Ajoutez un bloc try/catch/finally.

    try {} catch (Exception e) {} finally {} 
    
  6. À l'intérieur du bloc try,

    1. obtenez une base de données lisible si elle n'existe pas.

      1
      2
      3
      if (mReadableDB == null) { 
          mReadableDB = getReadableDatabase(); 
      } 
      
    2. envoyez une requête brute à la base de données et stockez le résultat dans un curseur.

      cursor = mReadableDB.rawQuery(query, null); 
      

      La méthode d'aide ouverte query peut construire une chaîne de requête SQL et l'envoyer en tant que rawQuery à la base de données qui renvoie un curseur. Si vos données sont fournies par votre application et sous votre contrôle total, vous pouvez utiliser raw query().

    3. Déplacez le curseur sur le premier élément.

      if (cursor != null && cursor.moveToFirst()) { 
      } 
      
    4. Définissez l'ID et le mot de l'entrée WordItem sur les valeurs renvoyées par le curseur.

      1
      2
      3
      4
      5
      6
      // Utiliser getColumnIndexOrThrow pour la sécurité
      int idIndex = cursor.getColumnIndexOrThrow(KEY_ID);
      int wordIndex = cursor.getColumnIndexOrThrow(KEY_WORD);
      
      entry.setId(cursor.getInt(idIndex));
      entry.setWord(cursor.getString(wordIndex)); 
      
  7. Dans le bloc catch, enregistrez l'exception.

    Log.d(TAG, "QUERY EXCEPTION! " + e.getMessage());
    
  8. Dans le bloc finally, fermez le curseur et renvoyez l'entrée WordItem.

    1
    2
    3
    4
    if (cursor != null) {
        cursor.close(); // Fermer le curseur ici
    }
    return entry;
    
Solution O_O
public WordItem query(int position) {
    String query = "SELECT * FROM " + WORD_LIST_TABLE +
            " ORDER BY " + KEY_WORD + " ASC " +
            "LIMIT " + position + ",1";

    Cursor cursor = null;
    WordItem entry = new WordItem();

    try {
        if (mReadableDB == null) {
            mReadableDB = getReadableDatabase();
        }
        cursor = mReadableDB.rawQuery(query, null);
        if (cursor != null && cursor.moveToFirst()) {
            // Utiliser getColumnIndexOrThrow pour la sécurité
            int idIndex = cursor.getColumnIndexOrThrow(KEY_ID);
            int wordIndex = cursor.getColumnIndexOrThrow(KEY_WORD);

            entry.setId(cursor.getInt(idIndex));
            entry.setWord(cursor.getString(wordIndex));
        }
    } catch (Exception e) {
        Log.d(TAG, "QUERY EXCEPTION! " + e.getMessage());
    } finally {
        if (cursor != null) {
            cursor.close(); // Fermer le curseur ici
        }
        return entry;
    }
}

2. La méthode onUpgrade

Chaque SQLiteOpenHelper doit implémenter la méthode onUpgrade(), qui détermine ce qui se passe si le numéro de version de la base de données change. Cela peut se produire si vous avez des utilisateurs existants de votre application qui utilisent une ancienne version de la base de données. Cette méthode est déclenchée lors de la première ouverture d'une base de données. L'action par défaut habituelle consiste à supprimer la base de données actuelle et à la recréer.

Important

Bien qu'il soit acceptable de supprimer la table dans un exemple d'application, dans une application de production, vous devez migrer soigneusement les précieuses données de l'utilisateur.

Vous pouvez utiliser le code ci-dessous pour implémenter la méthode onUpgrade() pour cet exemple.

Code standard pour onUpgrade() :

1
2
3
4
5
6
7
8
9
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    Log.w(WordListOpenHelper.class.getName(), 
            "Mise à niveau de la base de données de la version " + oldVersion + " vers " 
                + newVersion + ", ce qui détruira toutes les anciennes données"); 

    db.execSQL("DROP TABLE IF EXISTS " + WORD_LIST_TABLE); 
    onCreate(db); 
} 

Félicitations !

Vous avez complété la tâche 3. Vous avez implémenté la méthode query() dans WordListOpenHelper. N'oubliez pas de committer sur la branche tp-sqlite de votre dépot git local.