Aller au contenu

Tâche 1 : Étendre SQLiteOpenHelper pour créer et remplir une base de données

Les applications Android peuvent utiliser les bases de données SQLite standard pour stocker des données. Cet exercice pratique n'enseigne pas SQLite, mais montre comment l'utiliser dans une application Android.

Imprimé écran de l'application

SQLOpenHelper est une classe utilitaire du SDK Android permettant d'interagir avec un objet base de données SQLite. Elle inclut les méthodes onCreate() et onUpdate() que vous devez implémenter, ainsi que les méthodes pratiques d'insertion, de suppression, de mise à jour et d'interrogation pour toutes vos interactions avec la base de données.

La classe SQLOpenHelper se charge d'ouvrir la base de données si elle existe, de la créer si elle n'existe pas et de la mettre à jour si nécessaire.

Remarque

Vous pouvez avoir plusieurs bases de données par application et plusieurs assistants ouverts pour les gérer. Cependant, envisagez de créer plusieurs tables dans la même base de données au lieu d'utiliser plusieurs bases de données pour des raisons de performances et de simplicité architecturale.

1 Créer une classe squelette WordListOpenHelper

La première étape pour ajouter une base de données à votre code consiste toujours à créer une sous-classe de SQLiteOpenHelper et à implémenter ses méthodes.

  1. Créez une nouvelle classe Java WordListOpenHelper avec la signature suivante.

    public class WordListOpenHelper extends SQLiteOpenHelper {} 
    
  2. Dans l'éditeur de code, survolez l'erreur, puis cliquez sur l'image de l'ampoule et sélectionnez Implémenter les méthodes. Assurez-vous que les deux méthodes sont mises en surbrillance et cliquez sur OK.

  3. Ajoutez le constructeur manquant pour WordListOpenHelper. (Vous définirez ensuite les constantes non définies.)

    1
    2
    3
    public WordListOpenHelper(Context context) { 
        super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 
    

2 Ajouter des constantes de base de données à WordListOpenHelper

  1. En haut de la classe WordListOpenHelper, définissez les constantes pour les tables, les lignes et les colonnes comme indiqué dans le code ci-dessous. Cela devrait éliminer toutes les erreurs.

    // C'est une bonne idée de toujours définir une balise de journal comme celle-ci. 
    private static final String TAG = WordListOpenHelper.class.getSimpleName(); 
    
    // doit être 1 la première fois ou l'application plantera 
    private static final int DATABASE_VERSION = 1; 
    private static final String WORD_LIST_TABLE = "word_entries"; 
    private static final String DATABASE_NAME = "wordlist"; 
    
    // Noms des colonnes... 
    public static final String KEY_ID = "_id"; 
    public static final String KEY_WORD = "word"; 
    
    // ... et un tableau de chaînes de colonnes. 
    private static final String[] COLUMNS = { KEY_ID, KEY_WORD }; 
    
  2. Exécutez votre code pour vous assurer qu'il ne contient plus d'erreurs.

3 Construisez la requête SQL et le code pour créer la base de données

Les requêtes SQL peuvent devenir assez complexes. Il est recommandé de construire les requêtes séparément du code qui les utilise. Cela améliore la lisibilité du code et facilite le débogage.

Continuez à ajouter du code à WordListOpenHelper.java :

  1. Sous les constantes, ajoutez le code suivant pour construire la requête. Reportez-vous au SQLite Primer si vous avez besoin d'aide pour comprendre cette requête.

    1
    2
    3
    4
    5
    6
    // Construisez la requête SQL qui crée la table. 
    private static final String WORD_LIST_TABLE_CREATE = 
            "CREATE TABLE " + WORD_LIST_TABLE + " (" + 
                    KEY_ID + " INTEGER PRIMARY KEY, " + 
                    // l'id s'incrémentera automatiquement si aucune valeur n'est passée 
                    KEY_WORD + " TEXT );"; 
    
  2. Ajoutez des variables d'instance pour les références aux bases de données accessibles en écriture et en lecture. Le stockage de ces références vous évite d'avoir à obtenir une référence de base de données à chaque fois que vous avez besoin de lire ou d'écrire.

    private SQLiteDatabase mWritableDB;
    private SQLiteDatabase mReadableDB; 
    
  3. Dans la méthode onCreate, ajoutez du code pour créer une base de données et la table (la classe d'assistance ne crée pas d'autre base de données, si elle existe déjà.)

    1
    2
    3
    4
    @Override 
    public void onCreate(SQLiteDatabase db) { 
        db.execSQL(WORD_LIST_TABLE_CREATE); 
    } 
    
  4. Corrigez l'erreur en renommant l'argument de la méthode de SQLiteDatabase en db.

4 Créer la base de données dans onCreate de MainActivity

Pour créer la base de données, créez une instance de la classe WordListOpenHelper que vous venez d'écrire.

  1. Ouvrez MainActivity et ajoutez une variable d'instance pour l'assistant ouvert :

    private WordListOpenHelper mDB; 
    
  2. Dans onCreate, initialisez mDB avec une instance de WordListOpenHelper. Ceci appelle onCreate de WordListOpenHelper, qui crée la base de données.

    mDB = new WordListOpenHelper(this); 
    
  3. Ajoutez un point d'arrêt, exécutez l'application avec le débogueur et vérifiez que mDB est une instance de WordListOpenHelper.

5 Ajouter des données à la base de données

La liste de mots de votre application peut provenir de nombreuses sources. Elle peut être entièrement créée par l'utilisateur, téléchargée depuis Internet ou générée à partir d'un fichier faisant partie de votre APK. Pour cet exercice pratique, vous allez alimenter votre base de données avec une petite quantité de données codées en dur. Notez que l'acquisition, la création et le formatage des données sont un sujet entièrement distinct qui n'est pas traité dans ce cours.

  1. Ouvrez WordListOpenHelper.
  2. Dans onCreate, après avoir créé la base de données, ajoutez un appel de fonction à

    fillDatabaseWithData(db); 
    

    Ensuite, implémentez la méthode fillDatabaseWithData() dans WordListOpenHelper.

  3. Implémentez le stub de méthode.

    private void fillDatabaseWithData(SQLiteDatabase db){} 
    
  4. À l'intérieur de la méthode, déclarez une chaîne de mots comme données fictives.

    1
    2
    3
    4
    String[] words = {"Android", "Adapter", "ListView", "AsyncTask", 
    "Android Studio", "SQLiteDatabase", "SQLOpenHelper", 
    "Data model", "ViewHolder","Android Performance", 
    "OnClickListener"}; 
    
  5. Créez un conteneur pour les données. La méthode insert que vous appellerez ensuite nécessite que les valeurs remplissent une ligne en tant qu'instance de ContentValues. Un ContentValues ​​stocke les données d'une ligne sous forme de paires clé-valeur, où la clé est le nom de la colonne et la valeur est la valeur à définir.

    // Créer un conteneur pour les données. 
    ContentValues ​​values ​​= new ContentValues(); 
    
  6. Ajoutez la clé/valeur de la première ligne à values, puis insérez cette ligne dans la base de données. Répétez l'opération pour tous les mots de votre tableau de mots.

  7. db.insert est une méthode pratique SQLiteDatabasepour insérer une ligne dans la base de données. (C'est une méthode pratique, car vous n'avez pas à écrire la requête SQL vous-même.)

  8. Le premier argument de db.insert est le nom de la table, WORD_LIST_TABLE .
  9. Le deuxième argument est un String nullColumnHack . C'est une solution de contournement SQL qui vous permet d'insérer des lignes vides. Voir la documentation de insert(). Utilisez null pour cet argument.
  10. Le troisième argument doit être un conteneur ContentValues ​​avec des valeurs pour remplir la ligne. Cet exemple n'a qu'une seule colonne "words" comme représenté par la constante KEY_WORD définie précédemment ; pour les tables avec plusieurs colonnes, ajoutez les valeurs de chaque colonne à ce conteneur.

    1
    2
    3
    4
    5
    6
    for (int i=0; i < words.length; i++) { 
        // Placer les paires colonne/valeur dans le conteneur. 
        // put() remplace les valeurs existantes. 
        values.put(KEY_WORD, words[i]); 
        db.insert(WORD_LIST_TABLE, null, values); 
    } 
    
  11. Avant d'exécuter et de tester votre application, vous devez effacer les données de votre base de données SQLite et supprimer la base de données. Ensuite, nous pouvons exécuter notre application et la recréer afin que la base de données soit initialisée avec les données de départ. Vous pouvez désinstaller l'application de votre appareil, ou vous pouvez effacer toutes les données de l'application depuis Paramètres > Applications > Liste de mots > Stockage > Effacer les données sur votre émulateur Android ou appareil physique

  12. Exécutez votre application. Vous ne verrez aucun changement dans l'interface utilisateur.

  13. Vérifiez les journaux et assurez-vous qu'il n'y a pas d'erreurs avant de continuer. Si vous rencontrez des erreurs, lisez attentivement les messages logcat et utilisez des ressources, telles que Stack Overflow, si vous êtes bloqué.

  14. Vous pouvez également vérifier dans les paramètres que le stockage des utilisateurs de l'application.

Félicitations !

Vous avez complété la tâche 1. Vous avez créé une base de données SQLite, créé une table et inséré des données dans la table. N'oubliez pas de committer sur la branche tp-sqlite de votre dépot git local. Et de poster une capture d'écran de votre application en fonctionnement dans les commentaires de votre PR.