Les bases de données Les bases de données pour Android sont fournies à l'aide d

Les bases de données Les bases de données pour Android sont fournies à l'aide de SQLite. L'avantage de SQLite est qu'il s'agit d'un SGBD très compact et par conséquent très efficace pour les applications embarquées, mais pas uniquement puisqu'on le trouve dans Skype, Adobe Reader, Firefox, etc. SQLite ne nécessite pas de serveur pour fonctionner, son exécution se fait dans le même processus que celui de l'application. SQLite pour Android SQLite a été inclus dans le cœur d'Android, ainsi chaque application peut avoir sa propre base de données. La classe qui utilise une base de données doit hériter de la classe SQLiteOpenHelper. En général, les bases de données sont stockées dans les répertoires de la forme /DATA/data/<package>/databases. Une base de données base1 est stockée dans /data/data//NOM_PACKAGE/databases/base1 où NOM_PACKAGE est le nom du package de l'application Android (celui indiqué dans AndroidManifest.xml) Il est possible d'avoir plusieurs bases de données par application, cependant chaque fichier créé l'est selon le mode MODE_PRIVATE. Les bases ne sont donc accessibles qu'au sein de l'application elle-même. Remarque Il est préférable d'incrémenter automatiquement la clé de chaque table de la BD. Le package principal qui contient les classes de gestion des bases de données est android.database.sqlite. Dans le code, une base de données est modélisée par un objet de la classe android.database.sqlite.SQLiteDatabase. Constructeur SQLiteOpenHelper(Context context,String name, SQLiteDatabase.CursorFactory factory, int version)  context est le contexte de l'application  name est le nom du fichier contenant la BD  factory est utilisé pour créer des Cursor. En général on met null  version est le numéro de version de la BD (commençant à 1). SQLiteDatabase.CursorFactory: crée des objets cursor ou null par défaut Sert à créer, ouvrir ou gérer une base de données. Pour créer une base de données SQLite, il faut créer une sous classe de SQLiteOpenHelper, puis redéfinir la méthode de onCreate(SQLiteDatabase db) dans laquelle on exécute des commandes SQLite. 1 C'est dans cette méthode que les instructions seront lancées pour créer les différentes tables et éventuellement les remplir avec des données initiales. Pour SQLite il n'existe que cinq types de données :  NULL pour les données NULL.  INTEGER pour les entiers (sans virgule).  REAL pour les nombres réels (avec virgule).  TEXT pour les chaînes de caractères.  BLOB pour les données brutes, par exemple, une image… Les étapes nécessaires :  Créer une classe MySQLiteHelper extends SQLiteOpenHelper.  Le constructeur de MySQLiteHelper doit appeler le constructeur de la super classe.  Redéfinir la méthode onCreate() pour créer les tables.  Redéfinir la méthode onUpgrade() pour supprimer les anciennes tables et créer les nouvelles. class MaBaseOpenHelper extends SQLiteOpenHelper { public MaBaseOpenHelper(Context context, String nom, CursorFactory cursorfactory, int version){ super(context, nom, cursorfactory, version); } @Override public void onCreate(SQLiteDatabase db) { // TODO Ajoutez votre code de création... } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Ajoutez votre code de mise à jour... }} La BD sera réellement créée lors du lancement de getWritableDatabase() (pour une base en lecture et écriture) ou de getReadableDatabase() (pour une base en lecture seule). Pour accéder à une base de données à l’aide de la classe SQLiteOpenHelper, vous pouvez appeler les méthodes getReadableDatabase et getWritableDatabase et ainsi obtenir une instance de la base de données respectivement en lecture seule et en lecture/écriture. private class maBase extends SQLiteOpenHelper { ... } maBase mb = new maBase(this,"base1", null, 1); SQLiteDatabase db = mb.getWritableDatabase(); ... SQLiteDatabase db = mb.getReadableDatabase(); Création de table Pour chaque champ de la table, on doit déclarer au moins deux informations le nom et le type Mais aussi des contraintes pour chaque attribut.  PRIMARY KEY pour désigner la clé primaire sur un attribut ;  NOT NULL pour indiquer que cet attribut ne peut valoir NULL ;  CHECK afin de vérifier que la valeur de cet attribut est cohérente ;  DEFAULT sert à préciser une valeur par défaut. 2 Syntaxe CREATE TABLE nom_de_la_table ( champ_1 type {contraintes}, champ_2 type {contraintes}, …); Exemple CREATE TABLE nom_de_la_table ( nom_du_champ_1 INTEGER PRIMARY KEY, nom_du_champ_2 TEXT NOT NULL, nom_du_champ_3 REAL NOT NULL CHECK (nom_du_champ_3 > 0), nom_du_champ_4 INTEGER DEFAULT 10); CREATE TABLE employe ( id INTEGER PRIMARY KEY AUTOINCREMENT, nom TEXT, salaire REAL ); Les requêtes Il existe deux types de requêtes SQL. Celles qui attendent une réponse, comme la sélection, et celles qui n'attendent pas de réponse. Pour exécuter une requête SQL du premier type, on utilise execSQL(String sql). Pour la mise à jour de la base de données, il faut implémenter la méthode void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion). Cette méthode est déclenchée à chaque fois que l'utilisateur met à jour son application. - oldVersion est le numéro de l'ancienne version de la base de données que l'application utilisait. - newVersion est le numéro de la nouvelle version. Android rajoute automatiquement dans la base une table qui contient la dernière valeur connue de la base. À chaque lancement, Android vérifiera la dernière version de la base par rapport à la version actuelle dans le code. Si le numéro de la version actuelle est supérieur à celui de la dernière version, alors cette méthode est lancée. Exemple public static final String req = "DROP TABLE IF EXISTS " + table1 + ";"; public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL(req); onCreate(db); } Exemple : création de base de données public class MySQLiteHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "BookDB"; public MySQLiteHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } 3 public void onCreate(SQLiteDatabase db) { // SQL statement to create book table String CREATE_BOOK_TABLE = "CREATE TABLE books (" + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "title TEXT, "+ "author TEXT )"; // create books table db.execSQL(CREATE_BOOK_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // Drop older books table if existed db.execSQL("DROP TABLE IF EXISTS books"); // create fresh books table this.onCreate(db); } } Remarque Une pratique courante avec la manipulation des bases de données est d'enregistrer les attributs, tables et requêtes dans des constantes. Ainsi on peut les retrouver et les modifier plus facilement. Tous ces attributs seront publics puisqu'il est possible qu'on manipule la base en dehors de cette classe. public class MainActivity extends SQLiteOpenHelper { public static final String METIER_KEY = "id"; public static final String METIER_NOM= "intitule"; public static final String METIER_SALAIRE = "salaire"; public static final String METIER_TABLE_NAME = "Metier"; public static final String METIER_TABLE_CREATE = "CREATE TABLE " + METIER_TABLE_NAME + " (" + METIER_KEY + " INTEGER PRIMARY KEY AUTOINCREMENT, " + METIER_NOM+ " TEXT, " + METIER_SALAIRE + " REAL);"; } La base de données sur un périphérique externe nécessite la permission WRITE_EXTERNAL_STORAGE, sinon la base de données sera en lecture seule. Après la création de la base de données nous passons à la manipulation de ces données (insertion, sélection, suppression, update, ..). Récupérer la base La classe SQLiteOpenHelper fournit la méthode getReadableDatabase() pour accéder à un objet SQLiteDatabase en lecture. public SQLiteDatabase getReadableDatabase () Cette méthode permet de récupérer un identifiant qui sera utilisé pour accéder à la base de données en lecture seul. 4 Cet identifiant sera valide jusqu'au prochain appel aux méthodes getWritableDatabase () ou close(). public SQLiteDatabase getWritableDatabase () Cette méthode permet de récupérer un identifiant qui sera utilisé pour accéder à la base de données en lecture ou en écriture. Ces méthodes peuvent retourner une exception SQLiteException en cas de problème. Ajout d’un nouvel enregistrement dans une table  L'ajout des enregistrements se fait par la méthode insert : insert (String table, String nullColumnHack, ContentValues values) Cette méthode permet d'insérer les valeurs indiquées par values dans la table et retourne le numéro de la ligne insérée ou -1 en cas d'erreur. o Values (classe ContentValues), ensemble de couples (clé, valeur) où la clé, de type String, représente le nom de la colonne et valeur, sa valeur o Le second argument nullColumnHack est le nom de colonne qui aura la valeur NULL si values est vide. Cela est dû au fait que SQLite ne permet pas de lignes vides. Ainsi avec cette colonne, au moins un champ dans la ligne aura une valeur (= NULL). ContentValues Pour ajouter une entrée dans la table, on utilise la classe ContentValues qui implémente une interface de type Map comprenant des méthodes supplémentaires pour les types de SQLite : Parmi les méthodes de cette classe SQLiteDatabase qui permettent de faire des opérations sur la base de données on trouve la méthode put. La méthode void put() Cette méthode permet de stocker une valeur. Cette valeur pouvant être de tous types. put(String key, type value)  type pourra être Byte, Integer, Long, String...byte[].  key est la clef à utiliser pour le mapping Exemple ContentValues value = new ContentValues(); value.put(INTITULE,"ddddd"); //m objet metier value.put(SALAIRE, 120000); mDb.insert(TABLE_NAME, age, value); Supprimer int delete(String table, String whereClause, String[] whereArgs). Permet de supprimer des enregistrements d'une table  table : La table qui possède les enregistrements à effacer. 5  whereClause Clause uploads/Litterature/ chap6-bases-de-donnees.pdf

  • 38
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager