Utiliser SQL pour lire et écrire dans une base de données

1. Avant de commencer

De nombreuses applications que vous utilisez stockent les données directement sur l'appareil. L'application Horloge stocke vos alarmes récurrentes, l'application Google Maps enregistre vos recherches récentes et l'application Contacts vous permet d'ajouter, de modifier et de supprimer les coordonnées de vos contacts.

La persistance des données, qui consiste à stocker ou à conserver les données sur l'appareil, joue un rôle essentiel dans le développement d'Android. Les données persistantes permettent de s'assurer que le contenu généré par l'utilisateur n'est pas perdu lorsque l'application est fermée ou que les données téléchargées depuis Internet sont enregistrées pour ne pas avoir à les télécharger à nouveau par la suite.

SQLite, qui est fourni par le SDK Android, est couramment utilisé par les applications Android afin d'assurer la persistance des données. Avec sa base de données relationnelle, il vous permet de représenter les données comme si vous les organisiez avec des classes Kotlin. Cet atelier de programmation vous explique les principes fondamentaux du langage SQL (Structured Query Language), qui, bien qu'il ne soit pas un langage de programmation réel, constitue un moyen simple et flexible de lire et modifier une base de données SQLite avec seulement quelques lignes de code.

Une fois que vous vous serez familiarisé avec SQL, vous serez prêt à utiliser la bibliothèque Room pour intégrer la persistance des données dans vos applications, ce que vous ferez plus loin dans ce module.

2. Concepts clés liés aux bases de données relationnelles

Qu'est-ce qu'une base de données ?

Si vous avez déjà utilisé un tableur comme Google Sheets, vous connaissez déjà les principes fondamentaux d'une base de données.

Une feuille de calcul se compose de tables de données distinctes ou de feuilles de calcul individuelles appartenant au même classeur.

1f2b00d3ca083c4a.png

Chaque table est composée de colonnes, qui définissent ce que les données représentent, et de lignes, qui représentent des éléments individuels avec des valeurs pour chaque colonne. Par exemple, vous pouvez définir des colonnes pour l'ID, le nom, le matière principale et la note d'un élève.

a441da5cc7be346b.png

Chaque ligne contient les données d'un seul élève, avec des valeurs pour chacune des colonnes.

6131d8a59996f521.png

Une base de données relationnelle fonctionne de la même manière.

  • Les tables définissent des regroupements généraux de données que vous souhaitez représenter, par exemple les étudiants et les professeurs.
  • Les colonnes définissent les données que chaque ligne de la table comporte.
  • Les lignes contiennent des données réelles, qui sont des valeurs correspondant à chaque colonne de la table.

La structure d'une base de données relationnelle reflète également ce que vous savez déjà sur les classes et les objets en Kotlin.

data class Student(
    id: Int,
    name: String,
    major: String,
    gpa: Double
)
  • Les classes, comme les tables, modélisent les données que vous souhaitez représenter dans votre application.
  • Comme les colonnes, les propriétés définissent les données spécifiques que chaque instance de la classe doit contenir.
  • Les objets, comme les lignes, sont les données réelles. Ils contiennent des valeurs pour chaque propriété définie dans la classe, tout comme les lignes comportent les valeurs de chaque colonne définie dans la table de données.

Tout comme une feuille de calcul peut contenir plusieurs feuilles et une application peut comporter plusieurs classes, une base de données peut inclure plusieurs tables. Une base de données est appelée base de données relationnelle lorsqu'elle modélise les relations entre les tables. Par exemple, un étudiant peut avoir un seul professeur comme directeur de thèse, alors que ce professeur peut être le directeur de thèse de plusieurs étudiants.

7f1b56e05520dc3.png

Chaque table d'une base de données relationnelle contient un identifiant unique pour les lignes. La plupart du temps, il s'agit d'une colonne dans laquelle la valeur pour chaque ligne est un entier incrémenté automatiquement. On appelle cette valeur la clé primaire.

Lorsqu'une table fait référence à la clé primaire d'une autre table, on parle de clé étrangère. La présence d'une clé étrangère signifie qu'il existe une relation entre les tables.

Qu'est-ce que SQLite ?

SQLite est une base de données relationnelle couramment utilisée. Plus précisément, SQLite désigne une bibliothèque C légère permettant de gérer des bases de données relationnelles avec le langage Structured Query Language, plus connu sous le nom de SQL.

Il n'est pas nécessaire d'apprendre le langage C ou tout autre langage de programmation pour utiliser une base de données relationnelle. SQL fournit simplement un moyen d'ajouter et de récupérer des données dans une base de données relationnelle avec quelques lignes de code.

Représenter des données avec SQLite

En langage Kotlin, vous connaissez des types de données comme Int et Boolean. Les bases de données SQLite utilisent également des types de données. Les colonnes d'une table de données doivent avoir un type de données spécifique. Le tableau suivant met en correspondance les types de données Kotlin courants et leurs équivalents SQLite.

Type de données Kotlin

Type de données SQLite

Int

INTEGER

String

VARCHAR ou TEXT

Boolean

BOOLEAN

Float, Double

REAL

Les tables d'une base de données et les colonnes de chaque table forment ensemble le schéma. Dans la section suivante, vous allez télécharger l'ensemble de données de démarrage et vous familiariser avec son schéma.

3. Télécharger l'ensemble de données de démarrage

La base de données de cet atelier de programmation est destinée à une application de messagerie fictive. Il utilise des exemples connus, tels que le tri et le filtrage des e-mails, ou la recherche par objet ou expéditeur, pour démontrer tout ce que vous pouvez faire avec le langage SQL. Cet exemple vise également à vous montrer les différents scénarios que vous pourriez rencontrer dans une application avant d'utiliser Room dans le prochain parcours.

Pour télécharger le projet de démarrage depuis la branche compose du dépôt GitHub SQL Basics, cliquez ici.

Utiliser l'outil d'inspection de bases de données

Pour utiliser l'outil d'inspection de bases de données, procédez comme suit :

  1. Exécutez l'application SQL Basics dans Android Studio. Lorsque l'application est lancée, l'écran suivant s'affiche.

76e94dfe2234c2b1.png

  1. Dans Android Studio, cliquez sur View > Tool Windows > App Inspection (Affichage > Outils Windows > Inspection de l'application).

cd5dd859d31cbab3.png

Un nouvel onglet intitulé App Inspection (Inspection de l'application) s'affiche en bas. L'onglet Database Inspector (Outil d'inspection de bases de données) est sélectionné. Il existe deux autres onglets, mais vous n'en aurez pas besoin. Le chargement peut prendre quelques secondes. Une fois terminé, vous devriez voir une liste sur la gauche contenant les tables de données. Vous pouvez les sélectionner pour exécuter des requêtes.

5ace24ac5cc15abc.png

  1. Cliquez sur le bouton Open New Query Tab (Ouvrir un nouvel onglet de requête) pour ouvrir un volet permettant d'exécuter une requête sur la base de données.

277ecff401ca5f1a.png

La table email comporte sept colonnes :

  • id : clé primaire
  • subject : objet de l'e-mail
  • sender : adresse e-mail de l'expéditeur
  • folder : dossier dans lequel se trouve le message ("Boîte de réception" ou "Spam", par exemple)
  • starred : indique si l'utilisateur a activé ou non le suivi de l'e-mail
  • read : indique si l'utilisateur a lu l'e-mail
  • received : date et heure de réception de l'e-mail

4. Lire des données avec une instruction SELECT

Instruction SQL SELECT

Une instruction SQL, parfois appelée requête, permet de lire ou de manipuler une base de données.

Vous pouvez lire des données à partir d'une base de données SQLite avec une instruction SELECT. Une instruction SELECT simple comprend le mot clé SELECT, suivi du nom de la colonne, du mot clé FROM, puis du nom de la table. Chaque instruction SQL se termine par un point-virgule (;).

2d7ff99736b072b9.png

Une instruction SELECT peut également renvoyer des données provenant de plusieurs colonnes. Vous devez séparer les noms des colonnes par une virgule.

cf94edd5de825043.png

Si vous souhaitez sélectionner toutes les colonnes de la table, utilisez le caractère générique (*) au lieu des noms de colonne.

fb75d3033c59949a.png

Dans les deux cas, une instruction SELECT simple comme celle-ci renvoie chaque ligne de la table. Il vous suffit de spécifier les noms de colonnes à renvoyer.

Lire des données de messagerie à l'aide d'une instruction SELECT

L'une des principales fonctionnalités d'une application de messagerie est d'afficher une liste de messages. Avec une base de données SQL, vous pouvez obtenir ces informations avec une instruction SELECT.

  1. Assurez-vous que la table email (e-mail) est sélectionnée dans Database Inspector (l'outil d'inspection de bases de données).

ffc77f938ea09071.png

  1. Essayez d'abord de sélectionner toutes les colonnes pour toutes les lignes de la table email.
SELECT * FROM email;
  1. Cliquez sur le bouton Run (Exécuter) en bas à droite de la zone de texte. Notez que l'intégralité de la table email est renvoyée.

4c3ea237c6ed2b57.png

  1. Essayez maintenant de ne sélectionner que l'objet pour chaque ligne.
SELECT subject FROM email;
  1. Vous remarquerez que, là encore, la requête renvoie chaque ligne, mais uniquement pour cette colonne.

69a20935721dcc2.png

  1. Vous pouvez également sélectionner plusieurs colonnes. Essayez de sélectionner l'objet et l'expéditeur.
SELECT subject, sender FROM email;
  1. Comme vous pouvez le constater, la requête renvoie chaque ligne de la table email, mais uniquement les valeurs de la colonne "subject" (objet) et "sender" (expéditeur).

4ae739dad54397ea.png

Félicitations ! Vous venez d'exécuter votre première requête. C'est bien, mais ce n'est qu'un début. Les possibilités du langage SQL sont multiples.

Vous pouvez être beaucoup plus précis avec les instructions SELECT en ajoutant des clauses pour spécifier un sous-ensemble de données, voire modifier la mise en forme de la sortie. Dans les sections suivantes, vous découvrirez les clauses couramment utilisées des instructions SELECT et vous verrez comment mettre en forme les données.

5. Utiliser des instructions SELECT avec des fonctions d'agrégation et des valeurs distinctes

Réduire les colonnes avec des fonctions d'agrégation

Les instructions SQL ne permettent pas uniquement de renvoyer des lignes. Le langage SQL propose diverses fonctions permettant d'effectuer une opération ou un calcul au niveau d'une colonne spécifique, comme trouver la valeur maximale ou compter le nombre de valeurs uniques possibles pour une colonne en particulier. Ces fonctions sont appelées fonctions d'agrégation. Au lieu de renvoyer toutes les données d'une colonne spécifique, vous pouvez renvoyer une valeur unique à partir d'une colonne spécifique.

Voici quelques exemples de fonctions d'agrégation SQL :

  • COUNT() : renvoie le nombre total de lignes correspondant à la requête.
  • SUM() : renvoie la somme des valeurs de toutes les lignes pour la colonne sélectionnée.
  • AVG() : affiche la valeur moyenne de toutes les valeurs de la colonne sélectionnée.
  • MIN() : renvoie la valeur la plus faible dans la colonne sélectionnée.
  • MAX() : renvoie la valeur la plus élevée dans la colonne sélectionnée.

Au lieu d'un nom de colonne, vous pouvez appeler une fonction d'agrégation et transmettre un nom de colonne en tant qu'argument entre parenthèses.

6730a62d583a0d9.png

Au lieu de renvoyer la valeur de cette colonne pour chaque ligne de la table, une seule valeur est renvoyée après l'appel de la fonction d'agrégation.

Les fonctions d'agrégation peuvent être un moyen efficace d'effectuer des calculs à partir d'une valeur lorsque vous n'avez pas besoin de lire toutes les données d'une base de données. Par exemple, vous pouvez déterminer la moyenne des valeurs d'une colonne sans avoir à charger l'intégralité de la base de données dans une liste et à la calculer manuellement.

Examinons certaines des fonctions d'agrégation en action avec la table email :

  1. Imaginons une application qui souhaite connaître le nombre total d'e-mails reçus. Pour ce faire, utilisez la fonction COUNT() et le caractère générique *.
SELECT COUNT(*) FROM email;
  1. La requête renvoie une seule valeur. Vous pouvez n'utiliser qu'une requête SQL, sans aucun code Kotlin, pour compter les lignes manuellement.

5d49b987545184bb.png

  1. Pour obtenir l'heure du message le plus récent, vous pouvez utiliser la fonction MAX() au niveau de la colonne "received" (réception), car l'heure Unix la plus récente correspond au nombre le plus élevé.
SELECT MAX(received) FROM email;
  1. La requête renvoie un seul résultat, à savoir le nombre le plus élevé (l'heure Unix la plus récente) dans la colonne "received" (réception).

d0241dce845c3955.png

Filtrer les résultats en double avec DISTINCT

Lorsque vous sélectionnez une colonne, vous pouvez la faire précéder du mot clé DISTINCT. Cette approche peut être utile si vous souhaitez supprimer les éléments en double du résultat de la requête.

4f02533256302f26.png

Par exemple, de nombreuses applications de messagerie proposent une fonctionnalité de saisie semi-automatique pour les adresses. Vous pouvez inclure toutes les adresses d'expéditeurs qui vous ont envoyé un e-mail et les afficher sous forme de liste.

  1. Exécutez la requête suivante afin de renvoyer la colonne sender pour chaque ligne.
SELECT sender FROM email;
  1. Notez que le résultat contient de nombreuses adresses en double, ce qui est loin d'être idéal.

4f0489d1668dbede.png

  1. Ajoutez le mot clé DISTINCT avant la colonne "sender" (expéditeur), puis réexécutez la requête.
SELECT DISTINCT sender FROM email;
  1. Comme vous pouvez le constater, le résultat contient désormais beaucoup moins d'adresses et chaque valeur est unique.

43a47ad8d18fee6e.png

Vous pouvez également ajouter le mot clé DISTINCT avant le nom de la colonne dans une fonction d'agrégation.

55c45cb9c258e882.png

Imaginons que vous souhaitiez connaître le nombre d'expéditeurs uniques dans la base de données. Vous pouvez compter le nombre d'expéditeurs uniques avec la fonction d'agrégation COUNT() et le mot clé DISTINCT dans la colonne sender.

  1. Exécutez une instruction SELECT en transmettant DISTINCT sender à la fonction COUNT().
SELECT COUNT(DISTINCT sender) FROM email;
  1. La requête nous indique alors qu'il existe 14 expéditeurs uniques.

19ae43b0bc9a927e.png

6. Filtrer les requêtes avec une clause WHERE

De nombreuses applications de messagerie permettent de filtrer les messages en fonction de certains critères, tels que les données, le terme de recherche, le dossier et l'expéditeur. Pour ces types de cas d'utilisation, vous pouvez ajouter une clause WHERE à votre requête SELECT.

Après le nom de la table, sur une nouvelle ligne, vous pouvez ajouter le mot clé WHERE suivi d'une expression. Lors de l'écriture de requêtes SQL plus complexes, il est courant de placer chaque clause sur une nouvelle ligne pour une meilleure lisibilité.

707b0641aa2de0f.png

Cette requête effectue une vérification booléenne pour chaque ligne sélectionnée. Si la vérification renvoie la valeur "true", elle inclut la ligne dans le résultat de la requête. Les lignes pour lesquelles la requête renvoie la valeur "false" ne figurent pas dans le résultat.

Par exemple, une application de messagerie peut contenir des filtres antispam, des filtres pour la corbeille ou les brouillons, ou encore des filtres créés par les utilisateurs. Les instructions suivantes utilisent une clause WHERE :

  1. Exécutez une instruction SELECT pour renvoyer toutes les colonnes (*) de la table email, y compris une clause WHERE pour vérifier la condition folder = 'inbox'. Notez qu'il ne s'agit pas d'une faute de frappe : en SQL, vous utilisez un seul signe égal pour vérifier l'égalité et des guillemets simples au lieu de guillemets doubles pour représenter une valeur de chaîne.
SELECT * FROM email
WHERE folder = 'inbox';
  1. Le résultat renvoie uniquement les lignes des messages dans la boîte de réception de l'utilisateur.

6e9f2a17186d7faa.png

Opérateurs logiques avec des clauses WHERE

Les clauses SQL WHERE ne se limitent pas à une seule expression. Vous pouvez utiliser le mot clé AND, équivalent à l'opérateur Kotlin AND (&&) pour n'inclure que les résultats remplissant les deux conditions.

d8a698416e55d11b.png

Vous pouvez également vous servir du mot clé OR, équivalent à l'opérateur Kotlin OR (||) pour inclure dans les résultats les lignes qui remplissent l'une ou l'autre des conditions.

f3cecac289e7650d.png

Pour une meilleure lisibilité, vous pouvez également exclure une expression à l'aide du mot clé NOT.

27300a0a38ef0343.png

De nombreuses applications de messagerie autorisent plusieurs filtres (pour n'afficher que les e-mails non lus, par exemple).

Essayez ces clauses WHERE plus complexes au niveau de la table email :

  1. En plus de ne renvoyer que les messages de la boîte de réception de l'utilisateur, essayez de limiter les résultats aux messages non lus, pour lesquels la valeur de la colonne "read" (message lu) est "false".
SELECT * FROM email
WHERE folder = 'inbox' AND read = false;
  1. Notez qu'après l'exécution de la requête, les résultats ne contiendront que les e-mails non lus dans la boîte de réception de l'utilisateur.

d9ebd307a146d320.png

  1. Renvoyez tous les e-mails qui se trouvent dans le dossier important OR qui sont suivis (starred = true). Le résultat inclura des e-mails qui se trouvent dans différents dossiers dans la mesure où ils sont suivis.
SELECT * FROM email
WHERE folder = 'important' OR starred = true;
  1. Observez le résultat.

fd2f0dc7b6444956.png

Rechercher du texte avec LIKE

La clause WHERE vous permet de rechercher du texte dans une colonne spécifique, ce qui est particulièrement utile. Pour ce faire, spécifiez un nom de colonne, suivi du mot clé LIKE, puis d'une chaîne de recherche.

6692c0d491b6f9af.png

La chaîne de recherche commence par le symbole de pourcentage (%), suivi du texte à rechercher (terme de recherche), puis du symbole de pourcentage (%).

c69c15f654645ee2.png

Si vous recherchez un préfixe (des résultats commençant par le texte spécifié), omettez le premier symbole de pourcentage (%).

fbe6a94daaf173ae.png

Si vous recherchez un suffixe, omettez le dernier symbole de pourcentage (%).

141f567c9cbc4029.png

Dans de nombreux cas d'utilisation, une application peut utiliser la recherche de texte, par exemple pour rechercher des e-mails dont l'objet contient des mots en particulier ou mettre à jour les suggestions de saisie semi-automatique.

Les instructions suivantes vous permettent d'effectuer une recherche de texte lorsque vous interrogez la table email.

  1. Dans cet exemple, nous allons nous concentrer sur le terme "fool". Exécutez la requête suivante pour obtenir le nombre total d'e-mails dont l'objet contient le texte "fool".
SELECT COUNT(*) FROM email
WHERE subject LIKE '%fool%';
  1. Observez le résultat.

fd2ff96969824b0d.png

  1. Exécutez la requête suivante pour renvoyer toutes les colonnes pour toutes les lignes où l'objet se termine par le terme "fool".
SELECT * FROM email
WHERE subject LIKE '%fool';
  1. Notez que deux lignes sont renvoyées.

a23379e507e39c0b.png

  1. Exécutez la requête suivante pour renvoyer des valeurs distinctes de la colonne sender commençant par la lettre h.
SELECT DISTINCT sender FROM email
WHERE sender LIKE 'h%';
  1. Notez que la requête renvoie trois valeurs : helena@example.com, hyppolytus@example.com et hermia@example.com.

47ada07aee5cd8d9.png

7. Regrouper, trier et limiter les résultats

Regrouper les résultats avec GROUP BY

Vous venez d'apprendre à utiliser les fonctions d'agrégation et la clause WHERE pour filtrer et affiner les résultats. SQL propose plusieurs autres clauses qui peuvent vous aider à mettre en forme les résultats d'une requête. Ces clauses peuvent par exemple vous permettre de regrouper, trier et affiner les résultats.

Vous pouvez utiliser une clause GROUP BY pour regrouper les résultats afin que toutes les lignes ayant la même valeur pour une colonne donnée soient regroupées les unes à côté des autres dans les résultats. Cette clause ne modifie pas les résultats. Elle ajuste uniquement l'ordre dans lequel ils sont renvoyés.

Pour ajouter une clause GROUP BY à une instruction SELECT, ajoutez le mot clé GROUP BY suivi du nom de la colonne que vous souhaitez utiliser pour regrouper les résultats.

6be095e981498bbf.png

Un cas d'utilisation courant consiste à associer une clause GROUP BY à une fonction d'agrégation pour partitionner le résultat d'une fonction d'agrégation sur différents buckets (par exemple, les valeurs d'une colonne). Par exemple, supposons que vous souhaitiez déterminer le nombre d'e-mails dans chaque dossier ('inbox','spam', etc.). Vous pouvez sélectionner à la fois folder et la colonne COUNT(), puis spécifier la colonne folder dans la clause GROUP BY.

  1. Exécutez la requête suivante pour sélectionner la colonne de dossier et le résultat de la fonction d'agrégation COUNT(). Utilisez une clause GROUP BY pour segmenter les résultats par valeur dans la colonne folder.
SELECT folder, COUNT(*) FROM email
GROUP BY folder;
  1. Observez les résultats. La requête renvoie le nombre total d'e-mails pour chaque dossier.

13b9eb8f5c8230c4.png

Trier les résultats avec ORDER BY

Vous pouvez également modifier l'ordre des résultats de la requête lorsque vous les triez à l'aide de la clause ORDER BY. Ajoutez le mot clé ORDER BY, suivi d'un nom de colonne, puis de l'ordre de tri.

9cf561c6346ed6e0.png

Par défaut, l'ordre de tri est croissant, vous pouvez donc omettre cette information dans la clause ORDER BY. Si vous souhaitez que les résultats soient triés par ordre décroissant, ajoutez DESC après le nom de la colonne.

En général, on s'attend à ce qu'une application de messagerie affiche en premier les e-mails les plus récents. Les instructions suivantes vous permettent d'obtenir cet ordre d'affichage avec une clause ORDER BY.

  1. Ajoutez une clause ORDER BY pour trier les e-mails non lus, en fonction de la colonne received. Étant donné que l'ordre croissant (la valeur la plus basse ou la plus ancienne s'affiche en premier) est utilisé par défaut, vous devez utiliser le mot clé DESC.
SELECT * FROM email
ORDER BY received DESC;
  1. Observez le résultat.

6e28aef784a16d1b.png

Vous pouvez utiliser une clause ORDER BY avec une clause WHERE. Imaginons qu'un utilisateur souhaite rechercher les anciens e-mails contenant le mot fool. Il peut trier les résultats pour afficher les e-mails les plus anciens en premier, dans l'ordre croissant.

  1. Sélectionnez tous les e-mails dont l'objet contient le mot "fool" et triez les résultats dans l'ordre croissant. Étant donné que l'ordre est croissant, qui est l'option par défaut, l'utilisation du mot clé ASC avec la clause ORDER BY est facultative.
SELECT * FROM email
WHERE subject LIKE '%fool%'
ORDER BY received ASC;
  1. Notez que les résultats filtrés sont renvoyés et affichent la valeur la plus ancienne en premier, c'est-à-dire la valeur la plus faible dans la colonne "received" (réception).

77ada71b663afab6.png

Limiter le nombre de résultats avec LIMIT

Jusqu'à présent, tous les exemples ont renvoyé chaque résultat de la base de données correspondant à la requête. Dans de nombreux cas, vous n'avez besoin d'afficher qu'un nombre limité de lignes de votre base de données. Vous pouvez ajouter une clause LIMIT à votre requête pour ne renvoyer qu'un nombre spécifique de résultats. Ajoutez le mot clé LIMIT suivi du nombre maximal de lignes que vous souhaitez afficher. Le cas échéant, la clause LIMIT apparaît après la clause ORDER BY.

122152adf15a9fca.png

Vous avez la possibilité d'inclure le mot clé OFFSET suivi d'un autre nombre pour "ignorer" un nombre spécifique de lignes. Par exemple, si vous souhaitez accéder aux 10 résultats qui suivent les 10 premiers, mais pas aux 20 premiers résultats, vous pouvez utiliser LIMIT 10 OFFSET 10.

37ad836862573d55.png

Dans une application, vous pouvez charger les e-mails plus rapidement en ne renvoyant que les 10 premiers messages dans la boîte de réception de l'utilisateur. Il peut ensuite faire défiler les pages pour consulter les e-mails suivants. Les instructions ci-dessous incluent une clause LIMIT pour obtenir ce comportement.

  1. Exécutez l'instruction SELECT suivante pour obtenir tous les e-mails de la boîte de réception de l'utilisateur dans l'ordre décroissant en vous limitant aux 10 premiers résultats.
SELECT * FROM email
WHERE folder = 'inbox'
ORDER BY received DESC
LIMIT 10;
  1. Notez que seulement 10 résultats sont renvoyés.

5b228d8053956489.png

  1. Modifiez et réexécutez la requête pour inclure le mot clé OFFSET avec la valeur 10.
SELECT * FROM email
WHERE folder = 'inbox'
ORDER BY received DESC
LIMIT 10 OFFSET 10;
  1. La requête renvoie 10 résultats par ordre décroissant. Cependant, elle ignore les 10 premiers résultats.

83a6ddbf6ef92b89.png

8. Insérer, mettre à jour et supprimer des données dans une base de données

Insérer des données dans une base de données

En plus de lire une base de données, différentes instructions SQL permettent d'écrire dans une base de données, ce qui est une étape essentielle.

Vous pouvez ajouter une ligne à une base de données avec une instruction INSERT. Une instruction INSERT commence par INSERT INTO suivi du nom de la table dans laquelle vous souhaitez insérer une nouvelle ligne. Le mot clé VALUES apparaît sur une nouvelle ligne, suivie d'un ensemble de parenthèses contenant une liste de valeurs séparées par une virgule. Vous devez lister les valeurs dans le même ordre que les colonnes de la base de données.

97b93929d6de2d0e.png

Imaginons que l'utilisateur reçoive un nouvel e-mail et que nous devions le stocker dans la base de données de notre application. Nous pouvons utiliser une instruction INSERT pour ajouter une ligne à la table email.

  1. Exécutez une instruction INSERT avec les données suivantes pour un nouvel e-mail. Comme ce message est nouveau, il n'est pas lu et apparaît d'abord dans le folder (dossier) "Inbox" (Boîte de réception). Une valeur de NULL est fournie pour la colonne id, ce qui signifie que l'id est automatiquement généré avec le prochain nombre entier incrémenté disponible.
INSERT INTO email
VALUES (
    NULL, 'Lorem ipsum dolor sit amet', 'sender@example.com', 'inbox', false, false, CURRENT_TIMESTAMP
);
  1. Notez que le résultat est inséré dans la base de données avec l'id 44.
SELECT * FROM email
WHERE sender = 'sender@example.com';

12a3e77309771dd8.png

Mettre à jour des données dans une base de données

Une fois que vous avez inséré des données dans une table, vous pouvez les modifier à tout moment. Vous pouvez mettre à jour la valeur d'une ou de plusieurs colonnes à l'aide d'une instruction UPDATE. Une instruction UPDATE commence par le mot clé UPDATE, suivi du nom de la table, puis d'une clause SET.

8ee88a5985aec77e.png

Une clause SET est composée du mot clé SET, suivi du nom de la colonne que vous souhaitez mettre à jour.

bc255ece789859f.png

Une instruction UPDATE inclut souvent une clause WHERE pour spécifier la ou les lignes que vous souhaitez mettre à jour avec la paire colonne/valeur spécifiée.

e64b7b343feb6224.png

Par exemple, si l'utilisateur souhaite marquer un e-mail comme lu, vous utiliserez une instruction UPDATE pour mettre à jour la base de données. Les instructions suivantes vous permettent de marquer l'e-mail inséré à l'étape précédente comme lu.

  1. Exécutez l'instruction UPDATE suivante pour définir la ligne avec l'id 44 afin que la valeur de la colonne read soit true.
UPDATE email
SET read = true
WHERE id = 44;
  1. Exécutez une instruction SELECT pour cette ligne spécifique afin de valider le résultat.
SELECT read FROM email
WHERE id = 44;
  1. Notez que la valeur de la colonne "read" (message lu) est désormais 1 pour "true" et non 0 pour "false".

74e9af167fa49ba3.png

Supprimer une ligne d'une base de données

Enfin, vous pouvez utiliser une instruction SQL DELETE pour supprimer une ou plusieurs lignes d'une table. Une instruction DELETE commence par le mot clé DELETE, suivi du mot clé FROM, puis du nom de la table et d'une clause WHERE pour spécifier la ou les lignes que vous souhaitez supprimer.

a7e56405c5e5aaab.png

Les instructions suivantes utilisent une instruction DELETE pour supprimer de la base de données la ligne précédemment insérée, puis mise à jour.

  1. Exécutez l'instruction DELETE ci-dessous pour supprimer de la base de données la ligne associée à l'id 44.
DELETE FROM email
WHERE id = 44;
  1. Validez les modifications à l'aide d'une instruction SELECT.
SELECT * FROM email
WHERE id = 44;
  1. Notez que la ligne associée à l'id 44 n'existe plus.

b026810cf2fd6e44.png

9. Résumé

Félicitations ! Vous avez appris beaucoup de choses. Vous pouvez désormais lire des données dans une base de données à l'aide des instructions SELECT, y compris WHERE, GROUP BY, ORDER BY et LIMIT pour filtrer les résultats. Vous avez également découvert les fonctions d'agrégation fréquemment utilisées, ainsi que le mot clé DISTINCT pour spécifier des résultats uniques et le mot clé LIKE pour effectuer une recherche textuelle parmi les valeurs d'une colonne. Enfin, vous avez appris à insérer, mettre à jour et supprimer des lignes dans une table de données avec INSERT, UPDATE et DELETE.

Ces compétences vous serviront directement pour Room. Avec vos connaissances en SQL, vous serez parfaitement armé pour implémenter la persistance des données dans vos futures applications.

Syntaxe de l'instruction SELECT :

346bed4fda774ca7.png

10. En savoir plus

Nous nous sommes concentrés sur les principes de base de SQL et sur certains cas d'utilisation courants du développement Android, mais le langage SQL offre beaucoup d'autres possibilités. Consultez les ressources suivantes pour consolider ce que vous avez appris ou pour approfondir vos connaissances sur le sujet.