6 mai 2014

Android - Utilisation de la base de données relationnelles SQLite


Android permet la persistance de données à l'aide de la base de données relationnelles SQLite.

Chaque application peut disposer de sa propre base de données privée, inaccessible des autres applications.

La base de données d'une application est stockée dans le répertoire :
/data/data/[application.package.name]/databases

API

Nous entrons plus en détail au niveau de l'utilisation de la base de données SQLite.

SQLiteOpenHelper

Cette classe abstraite est à étendre afin d'implémenter les méthodes de gestion des connexions et des versions de la base SQLite de l'application.
  • méthodes principales :
    • constructeur de SQLiteOpenHelper :
      • Le constructeur demande le nom de la base ainsi que la version de la base. 
      • Le numéro de version permet d'indiquer un changement de version de la base lors de la mise à jour de l'application. La méthode onUpgrade sera alors appelée pour effectuer cette montée de version.
    • getReadableDatabase
      • créer une base si elle n'existe pas
      • et 
      • retourne un objet SQLiteDatabase qui contient la connexion à la base en lecture seule
    • getWritableDatabase :
      • créer une base si elle n'existe pas
      • et
      • retourne un objet SQLiteDatabase qui contient la connexion à la base en lecture et en écriture
    • close
      • fermer les connexions à la base de données
    • onCreate
      • méthode appelée lors de la création de la base de données
      • elle peut contenir le script SQL de création de la base de données
    • onUpgrade
      • méthode appelée lors de la montée de version de la base de données
      • elle peut contenir le script SQL de montée de version de la base de données

SQLiteDatabase

Elle permet de lancer des requêtes SQL, de démarrer des transactions et de gérer la base de données
  • méthodes principales :
    • query :
      • permet de lancer une requête SQL de recherche
      • elle retourne un objet Cursor pour parcourir les lignes du résultat de la requête SQL
    • execSQL :
      • exécuter une requête SQL
    • beginTransaction
      • démarrer une transaction
    • setTransactionSuccessful
      • indiquer que les modifications de la transaction seront à commiter en base de données
      • Ne plus faire de modification dans cette transaction après l'appel de cette méthode
    • endTransaction :
      • arrêter la transaction
      db.beginTransaction();
      try {
        ...
        db.setTransactionSuccessful();
      } finally {
        db.endTransaction();
      }

Cursor

Elle est retournée par la méthode query et permet de parcourir les lignes du résultat d'une requête
  • méthodes principales :
    • getCount : nombre de lignes de résultat
    • moveToNext : se déplacer au résultat suivant

ContentValues

Elle représente un enregistrement d'une table
Il s'agit d'une map avec en clé le nom de la colonne et en valeur la valeur de la colonne
  • méthodes principales :
    • getAs[Type](String columnName)
      • avec [Type] : le type Java de la colonne
      • récupérer la valeur de la colonne

Exemple d'utilisation de SQLite

Database.java

Gestionnaire de la base chargé de :
  • onCreate : créer la table des auteurs et créer trois auteurs
  • getAuthor : rechercher l'auteur "Stephen King"

MainActivity.java

On n'affiche rien, cette activité ne fait qu'utiliser le gestionnaire de la base et lancer une requête sur les auteurs :

Performances

Les traitements avec la base de données, notamment la création, sont coûteux en ressources et peuvent ralentir l'application. 
C'est pourquoi il est préférable de lancer ces traitements de manière asynchrone.