Aller au contenu

Tâche 5 : Ajouter de nouveaux mots à la base de données

Lorsque l'utilisateur clique sur le FAB, une activité s'ouvre et lui permet de saisir un mot qui sera ajouté à la base de données lorsqu'il cliquera sur Enregistrer.

Le code de démarrage vous fournit l'écouteur de clic et l'EditWordActivity démarré en cliquant sur le FAB. Vous ajouterez le code spécifique à la base de données et relierez les éléments ensemble, de bas en haut, comme vous venez de le faire avec la méthode de requête.

1. Écrivez la méthode insert()

Dans WordListOpenHelper :

  1. Créez la méthode insert() avec la signature suivante. L'utilisateur fournit un mot et la méthode renvoie l'identifiant de la nouvelle entrée. Les identifiants générés peuvent être grands, donc insert renvoie un nombre de type long.

    public long insert(String word){} 
    
  2. Déclarez une variable pour l'identifiant. Si l'opération d'insertion échoue, la méthode renvoie 0.

    long newId = 0; 
    
  3. Comme précédemment, créez une valeur ContentValues pour les données de la ligne.

    ContentValues ​​values ​​= new ContentValues(); 
    values.put(KEY_WORD, word); 
    
  4. Placez votre opération de base de données dans un bloc try/catch.

    1
    2
    3
    try {
    } catch (Exception e) {
    }
    
  5. Obtenez une base de données accessible en écriture si elle n'existe pas déjà.

    1
    2
    3
    if (mWritableDB == null) { 
        mWritableDB = getWritableDatabase(); 
    } 
    
  6. Insérer la ligne.

    newId = mWritableDB.insert(WORD_LIST_TABLE, null, values); 
    
  7. Enregistrer l'exception.

    Log.d(TAG, "INSERT EXCEPTION! " + e.getMessage()); 
    
  8. Renvoyer l'ID.

    return newId; 
    
Solution O_O
public long insert(String word){ 
    long newId = 0; 
    ContentValues ​​values ​​= new ContentValues(); 
    values.put(KEY_WORD, word); 
    try { 
        if (mWritableDB == null) { 
            mWritableDB = getWritableDatabase(); 
        } 
        newId = mWritableDB.insert(WORD_LIST_TABLE, null, values); 
    } catch (Exception e) {
        Log.d(TAG, "INSERT EXCEPTION! " + e.getMessage()); 
    } 
    return newId; 
} 

2. Obtenir le mot à insérer de l'utilisateur et mettre à jour la base de données

Le code de démarrage est fourni avec une EditWordActivity qui obtient un mot de l'utilisateur et le renvoie à l'activité principale. Dans MainActivity, il vous suffit de remplir la méthode onActivityResult() de mEditWordActivityLauncher

startActivityForResult() est obsolète

mEditWordActivityLauncher est une instance de ActivityResultLauncher<Intent>, qui est la nouvelle façon de gérer les résultats d'activité. Elle remplace la méthode obsolète startActivityForResult(). mEditWordActivityLauncher.launch(intent) démarre l'activité, et le résultat est géré dans la méthode onActivityResult() ci-dessous.

 // Register the activity result launcher
    mEditWordActivityLauncher =
            registerForActivityResult(
                    new ActivityResultContracts.StartActivityForResult(),
                    result -> {
                        if (result.getResultCode() == RESULT_OK && result.getData() != null) {
                            Intent data = result.getData();
                            // Add code to update the database.
                        }
                    });
  1. Vérifiez que le résultat provient de la bonne activité et obtenez le mot que l'utilisateur a saisi à partir des extras.

    if (resultCode == RESULT_OK) { 
            String word = data.getStringExtra(EditWordActivity.EXTRA_REPLY); 
    
  2. Si le mot n'est pas vide, vérifiez si un identifiant nous a été transmis avec les extras. S'il n'y a pas d'identifiant, insérez un nouveau mot. Dans la tâche suivante, vous mettrez à jour le mot existant si un identifiant est transmis.

    1
    2
    3
    4
    5
    if (!TextUtils.isEmpty(word)) { 
        int id = data.getIntExtra(WordListAdapter.EXTRA_ID, -99); 
        if (id == WORD_ADD) { 
            mDB.insert(word); 
    } 
    
  3. Pour mettre à jour l'interface utilisateur, notifiez l'adaptateur que les données sous-jacentes ont changé.

    mAdapter.notifyDataSetChanged(); 
    
  4. Si le mot est vide parce que l'utilisateur n'a rien saisi, affichez un toast pour le lui faire savoir. Et n'oubliez pas de fermer toutes les parenthèses.

    1
    2
    3
    4
    5
    6
    7
    8
    } else { 
        Toast.makeText( 
            getApplicationContext(), 
            R.string.empty_not_saved, 
            Toast.LENGTH_LONG).show(); 
            } 
        } 
    } 
    
Solution O_O
if (resultCode == RESULT_OK) { 
    String word = data.getStringExtra(EditWordActivity.EXTRA_REPLY); 
    // Mettre à jour la base de données 
    if (!TextUtils.isEmpty(word)) { 
        int id = data.getIntExtra(WordListAdapter.EXTRA_ID, -99); 
        if (id == WORD_ADD) { 
            mDB.insert(word); 
        } 
        // Mettre à jour l'interface utilisateur 
        mAdapter.notifyDataSetChanged(); 
    } else { 
        Toast.makeText( 
                getApplicationContext(), 
                R.string.empty_not_saved, 
                Toast.LENGTH_LONG).show(); 
    } 
} 

3. Implémenter getItemCount()

Pour que les nouveaux éléments s'affichent correctement, getItemCount dans WordListAdapter doit renvoyer le nombre réel d'entrées dans la base de données au lieu du nombre de mots dans la liste de démarrage des mots.

  1. Remplacez getItemCount par le code ci-dessous, ce qui déclenchera une erreur.

    return (int) mDB.count(); 
    
  2. Ouvrez WordListOpenHelper et implémentez count() pour renvoyer le nombre d'entrées dans la base de données.

    1
    2
    3
    4
    5
    6
    public long count(){ 
        if (mReadableDB == null) { 
            mReadableDB = getReadableDatabase(); 
        } 
        return DatabaseUtils.queryNumEntries(mReadableDB, WORD_LIST_TABLE); 
    } 
    
  3. Exécutez votre application et ajoutez des mots.

Félicitations !

Vous avez complété la tâche 5. Vous avez implémenté la méthode insert() dans WordListOpenHelper et mis à jour MainActivity pour insérer un nouveau mot dans la base de données. N'oubliez pas de committer sur la branche tp-sqlite de votre dépot git local.