Activité : Base de données sous Android

Documents pareils
1. Base de données SQLite

Bases de données et fournisseurs de contenu

CREATION WEB DYNAMIQUE

Stockage de données sous Android

SQL Historique

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Langage SQL : créer et interroger une base

Olivier Mondet

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

PHP 5. La base de données MySql. A. Belaïd 1

La programmation orientée objet Gestion de Connexions HTTP Manipulation de fichiers Transmission des données PHP/MySQL. Le langage PHP (2)

OpenPaaS Le réseau social d'entreprise

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

Modélisation PHP Orientée Objet pour les Projets Modèle MVC (Modèle Vue Contrôleur) Mini Framework

Introduction à JDBC. Accès aux bases de données en Java

Les BASES de DONNEES dans WampServer

PHP. Bertrand Estellon. 26 avril Aix-Marseille Université. Bertrand Estellon (AMU) PHP 26 avril / 214

TD : Requêtes SQL (BDR.TD2-1) INSA 3IF

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Bases de données relationnelles

Le langage SQL (première partie) c Olivier Caron

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Cours Bases de données 2ème année IUT

PHP. PHP et bases de données

I. MySQL : Serveur et SGBD

Premiers Pas en Programmation Objet : les Classes et les Objets

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Bases de Données relationnelles et leurs systèmes de Gestion

Création et Gestion des tables

Introduction aux Bases de Données 2004/2005

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

INSTITUT NATIONAL DES TELECOMMUNICATIONS CONTROLE DES CONNAISSANCES. 2. Les questions sont indépendantes les unes des autres.

Java DataBaseConnectivity

TP Contraintes - Triggers

Mysql avec EasyPhp. 1 er mars 2006

Pratique et administration des systèmes

Le Langage De Description De Données(LDD)

Comment Connecter une Base de Données MySQL via un Driver JDBC Avec OpenOffice.org

as Architecture des Systèmes d Information

I4 : Bases de Données

Installation d'un serveur FTP géré par une base de données MySQL

Bases de données Outils de gestion

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

TD/TP 1 Introduction au SDK d Android

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

TP base de données SQLite. 1 Différents choix possibles et choix de SQLite : 2 Définir une base de donnée avec SQLite Manager

Notes de cours : bases de données distribuées et repliquées

PHP 4 PARTIE : BASE DE DONNEES

BTS/CGO P10 SYSTEME INFORMATION Année

Historisation des données

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

Package Java.util Classe générique

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

Mise en oeuvre d'une base de données mono-utilisateur avec SQLite

Présentation Windows Azure Hadoop Big Data - BI

14/04/2014. un ensemble d'informations sur un sujet : exhaustif, non redondant, structuré, persistant. Gaëlle PERRIN SID2 Grenoble.

Programmation Android L3 informatique

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Plan. Bases de Données. Sources des transparents. Bases de SQL. L3 Info. Chapitre 4 : SQL LDD Le langage de manipulation de données : LMD

Partie 0 : Gestion des tablespace et des utilisateurs... 3

BASES DE DONNEES TP POSTGRESQL

Projet de programmation (IK3) : TP n 1 Correction

TD/TP PAC - Programmation n 3

Gestion de base de données

Encryptions, compression et partitionnement des données

SQL sous SqlServer OLIVIER D. DEHECQ Olivier 0

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

TP3 : Creation de tables 1 seance

Application BdD et JDBC. Introduction 1/28. I Dans tout les cas, une seule problématique. I Quelques alternatives :

Création d une application JEE

Programme Compte bancaire (code)

Pour les débutants. langage de définition des données

Les bases de données

Bases de SQL. Hacks 1-6 CHAPITRE UN

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

Mysql. Les requêtes préparées Prepared statements

Compétences Business Objects

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Stockage du fichier dans une table mysql:

SYNC FRAMEWORK AVEC SQLITE POUR APPLICATIONS WINDOWS STORE (WINRT) ET WINDOWS PHONE 8

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

BTS S.I.O PHP OBJET. Module SLAM4. Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais

Le Langage SQL version Oracle

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Une introduction à Java

Bases Java - Eclipse / Netbeans

Application web de gestion de comptes en banques

WEB DEVELOPER SGBD SYSTEME DE GESTION DE BASES DE DONNEES L étudiant sera capable :

A QUOI SERVENT LES BASES DE DONNÉES?

Programmation Par Objets

TP1 : Initiation à Java et Eclipse

PHP et les Bases de données - Généralités

Système de Gestion de Bases de Données Relationnelles. MySQL. Youssef CHAHIR

Performance web. Mesurer. Analyser. Optimiser. Benjamin Lampérier - Benoît Goyheneche. RMLL Beauvais. 8 Juillet 2015

Transcription:

Activité : Base de données sous Android Thierry Vaira <tvaira@free.fr> 19/03/2017 (rev. 1) Table des matières Base de données sous Android 1 La classe XXXSQLite.................................................... 1 La classe XXXBDD...................................................... 3 Effectuer des requêtes SQL................................................ 4 Exemples de requêtes................................................... 7 Base de données sous Android L application à développer devra utilisée la technique dite embedded SQL : les instructions en langage SQL seront incorporées dans le code source d un programme écrit dans un autre langage (ici le Java sous Android). Lire : Activité bases de données SQLite est une bibliothèque écrite en C qui propose un moteur de base de données relationnelle accessible par le langage SQL. Contrairement aux serveurs de bases de données traditionnels, comme MySQL ou PostgreSQL, sa particularité est de ne pas reproduire le schéma habituel client-serveur mais d être directement intégrée aux programmes. L intégralité de la base de données (déclarations, tables, index et données) est stockée dans un fichier indépendant de la plateforme. SQLite est le moteur de base de données le plus distribué au monde, grâce à son utilisation dans de nombreux logiciels grand public comme Firefox, Skype, Google Gears, dans certains produits d Apple, d Adobe et de McAfee et dans les bibliothèques standards de nombreux langages comme PHP ou Python. De par son extrême légèreté (moins de 300 Kio), il est également très populaire sur les systèmes embarqués, notamment sur la plupart des smartphones modernes : l iphone ainsi que les systèmes d exploitation mobiles Symbian et Android l utilisent comme base de données embarquée. SQLite est intégrée dans chaque appareil Android. Si l application crée une base de données, celle-ci est par défaut enregistrée dans le répertoire : /data/app_name/databases/ DATABASE_NAME. Le package android.database contient toutes les classes nécessaires pour travailler avec des bases de données. Le package android.database.sqlite contient les classes spécifiques à SQLite. La classe XXXSQLite Pour créer et mettre à jour une base de données SQLite dans une application Android, on doit créer une classe qui hérite de SQLiteOpenHelper. 1

Dans cette classe, on doit redéfinir les méthodes suivantes pour créer et mettre à jour la base de données : oncreate() : pour créer une base de données qui ne l est pas encore onupgrade() : si la version de la base de données évolue, cette méthode permettra de mettre à jour le schéma de base de données existant ou de supprimer la base de données existante et la recréer par la méthode oncreate(). Remarque : si on doit modifier la structure de la base de données, il faudra supprimer la base de données pour pouvoir re-appeler oncreate(). Pour cela, le plus simple est de supprimer les données associées à l application dans le menu Paramètres de la tablette. On crée une classe XXXSQLite, qui hérite donc de SQLiteOpenHelper, pour définir l ensemble des tables de la base de données qui seront produites lors de l instanciation. import android.content.context; import android.database.sqlite.*; public class XXXSQLite extends SQLiteOpenHelper public static final String DATABASE_NAME = "xxx.db"; public static final int DATABASE_VERSION = 1; // Pour création des tables private static final String CREATE_BDD_APPAREILS = "CREATE TABLE appareils (" + "idappareil INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + "nom VARCHAR(45) NULL," + "etat TINYINT(1) NULL );"; private static final String CREATE_BDD_CAPTEURS = "CREATE TABLE capteurs (" + "idcapteurs INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + "typecapteurs INTEGER NULL," + "nom VARCHAR(45) NULL," + "unite VARCHAR(45) NULL," + "CONSTRAINT fk_capteurs_1 FOREIGN KEY (typecapteurs ) REFERENCES typecapteurs (idtypecapteurs ) );"; private static final String CREATE_BDD_PARAMETRESVITAUX = "CREATE TABLE parametresvitaux (" + "idparametresvitaux INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + "idcapteur INTEGER NULL," + "mesure DOUBLE NULL," + "horodatage DATETIME," + "CONSTRAINT fk_parametresvitaux_1 FOREIGN KEY (idcapteur ) REFERENCES capteurs (idcapteurs ));"; private static final String CREATE_BDD_TYPECAPTEURS = "CREATE TABLE typecapteurs (" + "idtypecapteurs INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + "typecapteurs VARCHAR(45) NULL );"; // etc... // Pour insertion des données initiales private static final String INSERT_BDD_APPAREILS_1 = "INSERT INTO appareils VALUES(1,'chauffage',0);"; private static final String INSERT_BDD_APPAREILS_2 = "INSERT INTO appareils VALUES(2,'eclairage',0);"; private static final String INSERT_BDD_CAPTEURS_1 = "INSERT INTO capteurs VALUES(1,1,'temperature eau','c'); "; private static final String INSERT_BDD_CAPTEURS_2 = "INSERT INTO capteurs VALUES(2,1,'temperature air','c'); "; private static final String INSERT_BDD_CAPTEURS_3 = "INSERT INTO capteurs VALUES(3,2,'ph','');"; private static final String INSERT_BDD_CAPTEURS_4 = "INSERT INTO capteurs VALUES(4,3,'niveau d''eau','cm');" ; private static final String INSERT_BDD_TYPECAPTEURS_1 = "INSERT INTO typecapteurs VALUES(1,'temperature');"; private static final String INSERT_BDD_TYPECAPTEURS_2 = "INSERT INTO typecapteurs VALUES(2,'ph');"; private static final String INSERT_BDD_TYPECAPTEURS_3 = "INSERT INTO typecapteurs VALUES(3,'niveau');"; // etc... public XXXSQLite(Context context) super(context, DATABASE_NAME, null, DATABASE_VERSION); @Override public void oncreate(sqlitedatabase db) BTS SN La Salle Avignon 2 / 7 2017 tv <tvaira@free.fr>

// on crée la BDD : // 1. création des tables db.execsql(create_bdd_appareils); db.execsql(create_bdd_capteurs); db.execsql(create_bdd_parametresvitaux); db.execsql(create_bdd_typecapteurs); // 2. insertion des données initiales db.execsql(insert_bdd_appareils_1); db.execsql(insert_bdd_appareils_2); db.execsql(insert_bdd_capteurs_1); db.execsql(insert_bdd_capteurs_2); db.execsql(insert_bdd_capteurs_3); db.execsql(insert_bdd_capteurs_4); db.execsql(insert_bdd_typecapteurs_1); db.execsql(insert_bdd_typecapteurs_2); db.execsql(insert_bdd_typecapteurs_3); @Override public void onupgrade(sqlitedatabase db, int oldversion, int newversion) // on supprime la table puis on la recrée db.execsql("drop TABLE appareils;"); db.execsql("drop TABLE capteurs;"); db.execsql("drop TABLE parametresvitaux;"); db.execsql("drop TABLE typecapteurs;"); oncreate(db); Remarque : il est possible de récupérer la base de données créée à partir de l émulateur adb $ adb -d shell "run-as com.example.tv.app_name cat /data/data/com.example.tv.app_name/databases/database_name" > bd.sqlite On peut ensuite l ouvrir avec le plugin SQLite Manager de Firefox ou avec sqliteman. La classe XXXBDD SQLiteDatabase est la classe de base pour travailler avec une base de données SQLite sous Android et fournit des méthodes pour ouvrir, effectuer des requêtes, mettre à jour et fermer la base de données. On crée une classe XXXBDD, qui hérite donc de SQLiteDatabase, pour accéder à la base de données de l application. import android.content.context; import android.database.sqlite.sqlitedatabase; public class XXXBDD private SQLiteDatabase bdd = null; private XXXSQLite xxxsqlite = null; public XXXBDD(Context context) // on crée la BDD xxxsqlite = new GesAquaSQLite(context); public void open() // on ouvre la BDD en écriture if (bdd == null) bdd = xxxsqlite.getwritabledatabase(); BTS SN La Salle Avignon 3 / 7 2017 tv <tvaira@free.fr>

public void close() // on ferme la BDD if (bdd!= null) if (bdd.isopen()) bdd.close(); public SQLiteDatabase getbdd() // pas ouverte? if (bdd == null) open(); // on retourne un accès à la BDD return bdd; Le principe de son utilisation est le suivant : XXXBDD xxxbdd = new XXXBDD(this); SQLiteDatabase bdd = xxxbdd.getbdd(); xxxbdd.close(); Effectuer des requêtes SQL La classe SQLiteDatabase fournit des méthodes pour effectuer des requêtes sur les tables de la base de données : les méthodes insert(), update() et delete() la méthode execsql() qui permet d exécuter une instruction SQL la méthode rawquery() qui exécute une requête SQL SELECT la méthode query() qui fournit une interface structurée pour une requête SQL Les méthodes insert(), update() et delete() utilisent des objets ContentValues qui permettent de définir des clés/valeurs. La clé représente l identifiant de la colonne de la table et la valeur représente le contenu de l enregistrement dans cette colonne. ContentValues peut être utilisé pour les insertions et les mises à jour des enregistrements de la base de données. Les méthodes rawquery() et query() retournent un objet Cursor. Un curseur représente le résultat d une requête et pointe généralement vers une ligne de ce résultat. La classe Cursor fournit des méthodes getxxx() par type de données : getlong(columnindex), getstring(columnindex),... pour accéder aux données d une colonne de la position courante du résultat. Le paramètre columnindex est l index numérique de la colonne. On peut déplacer le curseur pour se positionner sur un résultat qaund la requête en a fourni plusieurs : movetofirst(), movetonext(),... On va créer une classe Appareils pour la table appareils. import android.content.contentvalues; import android.content.context; import android.database.cursor; import android.database.sqlite.sqlitedatabase; import java.util.arraylist; import java.util.list; public class Appareils private XXXBDD xxxbdd; private SQLiteDatabase bdd; public Appareils(Context context) xxxbdd = new GesAquaBDD(context); xxxbdd.open(); bdd = xxxbdd.getbdd(); BTS SN La Salle Avignon 4 / 7 2017 tv <tvaira@free.fr>

public List<Appareil> getliste() List<Appareil> appareils = new ArrayList<Appareil>(); Cursor cursor = bdd.query("appareils", new String[] "idappareil", "nom", "etat", null, null, null, null, null); cursor.movetofirst(); while (!cursor.isafterlast()) Appareil appareil = cursortoserveur(cursor, false); appareils.add(appareil); cursor.movetonext(); cursor.close(); return appareils; public long inserer(appareil appareil) ContentValues values = new ContentValues(); values.put("nom", appareil.getnom()); values.put("etat", appareil.getetat()); return bdd.insert("appareils", null, values); public int modifier(int id, Appareil appareil) ContentValues values = new ContentValues(); values.put("nom", appareil.getnom()); values.put("etat", appareil.getetat()); return bdd.update("appareils", values, "idappareil = " + id, null); public int supprimer(int id) return bdd.delete("appareils", "idappareil = " + id, null); public Appareil getappareil(string nom) Cursor c = bdd.rawquery("select * FROM appareils WHERE nom =?", new String[] nom ); return cursortoserveur(c, true); // Cette méthode permet de convertir un cursor en un objet de type Appareil private Appareil cursortoserveur(cursor c, boolean one) if (c.getcount() == 0) return null; if(one == true) c.movetofirst(); Appareil appareil = new Appareil(); appareil.setid(c.getint(0)); appareil.setnom(c.getstring(1)); appareil.setetat(c.getint(2)); BTS SN La Salle Avignon 5 / 7 2017 tv <tvaira@free.fr>

if(one == true) c.close(); return appareil; Cette classe manipule des objets Appareil : public class Appareil private int id; private String nom; private int etat; public Appareil() this.nom = ""; this.etat = 0; public Appareil(String nom, int etat) this.nom = nom; this.etat = etat; public int getid() return id; public void setid(int id) this.id = id; public String getnom() return nom; public void setnom(string nom) this.nom = nom; public int getetat() return etat; public void setetat(int etat) this.etat = etat; public String tostring() return "id : " + id + "\nnom : " + nom + "\netat : " + etat; BTS SN La Salle Avignon 6 / 7 2017 tv <tvaira@free.fr>

Exemples de requêtes -- Récupère les mesures de température (id = 1) SELECT * FROM parametresvitaux INNER JOIN capteurs ON parametresvitaux.idcapteur=capteurs.idcapteurs WHERE capteurs.idcapteurs=1 -- Récupère les mesures de température (id = 1) avec l'unite et l'horodatage SELECT parametresvitaux.mesure AS temperature, capteurs.unite, parametresvitaux.horodatage FROM parametresvitaux INNER JOIN capteurs ON parametresvitaux.idcapteur=capteurs.idcapteurs WHERE parametresvitaux.idcapteur=1 -- Récupère le nombre de mesures de température (id = 1) SELECT COUNT(*) FROM parametresvitaux INNER JOIN capteurs ON parametresvitaux.idcapteur=capteurs.idcapteurs WHERE capteurs.idcapteurs = 1 -- Récupère le minimum et le maximum des mesures de température (id = 1) SELECT MIN(parametresVitaux.mesure), MAX(parametresVitaux.mesure) FROM parametresvitaux INNER JOIN capteurs ON parametresvitaux.idcapteur=capteurs.idcapteurs WHERE capteurs.idcapteurs=1 -- Récupère les mesures de température (id = 1) avec l'unite et l'horodatage dans une plage horodatée SELECT parametresvitaux.mesure, capteurs.unite, parametresvitaux.horodatage FROM parametresvitaux INNER JOIN capteurs ON parametresvitaux.idcapteur = capteurs.idcapteurs WHERE capteurs.idcapteurs=1 AND parametresvitaux.horodatage>='2017-03-16 14:00:00' AND horodatage<='2017-03-16 14:01:00' -- Récupère les mesures de température (id = 1) avec l'unite et l'horodatage supérieure à un seuil SELECT parametresvitaux.mesure, capteurs.unite, parametresvitaux.horodatage FROM parametresvitaux INNER JOIN capteurs ON parametresvitaux.idcapteur=capteurs.idcapteurs WHERE capteurs.idcapteurs=1 AND parametresvitaux.mesure>24 -- Récupère la dernière mesure des 3 capteurs SELECT mesure FROM parametresvitaux WHERE horodatage IN (SELECT MAX(horodatage) FROM parametresvitaux) -- Récupère les 5 dernières mesures du capteur de ph SELECT * FROM (SELECT mesure, horodatage FROM parametresvitaux WHERE parametresvitaux.idcapteur=2 ORDER BY horodatage DESC LIMIT 5) tmp ORDER BY horodatage ASC LIMIT 5 Par exemple la requête qui récupère les mesures de température avec l unité et l horodatage se codera de la manière suivante : String requete = "SELECT parametresvitaux.mesure AS temperature, capteurs.unite, parametresvitaux.horodatage FROM parametresvitaux INNER JOIN capteurs ON parametresvitaux.idcapteur=capteurs.idcapteurs WHERE parametresvitaux.idcapteur=1"; Cursor c = bdd.rawquery(requete, null); //... BTS SN La Salle Avignon 7 / 7 2017 tv <tvaira@free.fr>