Bibliographie Créez des applications pour Android https://openclassrooms.com/courses/creez-des-applicationspour-android/les-bases-de-donnees-5

Documents pareils
Bases de données et fournisseurs de contenu

OpenPaaS Le réseau social d'entreprise

1. Base de données SQLite

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

Stockage de données sous Android

Cedric Dumoulin (C) The Java EE 7 Tutorial

Configurer la supervision pour une base MS SQL Server Viadéis Services

WEB page builder and server for SCADA applications usable from a WEB navigator

Instructions pour mettre à jour un HFFv2 v1.x.yy v2.0.00

Once the installation is complete, you can delete the temporary Zip files..

Instructions Mozilla Thunderbird Page 1

Quick Start Guide This guide is intended to get you started with Rational ClearCase or Rational ClearCase MultiSite.

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

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Vanilla : Virtual Box

Comment Accéder à des Bases de Données MySQL avec Windows lorqu'elles sont sur un Serveur Linux

Programmer en JAVA. par Tama

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)

1-Introduction 2. 2-Installation de JBPM 3. 2-JBPM en action.7

Exercices sur SQL server 2000

RAPID Prenez le contrôle sur vos données

How to Login to Career Page

Langage SQL : créer et interroger une base

Tutoriel d installation de Hibernate avec Eclipse

If the corporation is or intends to become a registered charity as defined in the Income Tax Act, a copy of these documents must be sent to:

Création d une application JEE

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)

CREATION WEB DYNAMIQUE

L installation a quelque peu changée depuis les derniers tutos, voici une actualisation.

Gestion des prestations Volontaire

Devoir Data WareHouse

Guide d'installation rapide TFM-560X YO.13

Paginer les données côté serveur, mettre en cache côté client

Olivier Mondet

calls.paris-neuroscience.fr Tutoriel pour Candidatures en ligne *** Online Applications Tutorial

Contents Windows

Web Tier : déploiement de servlets

3615 SELFIE. HOW-TO / GUIDE D'UTILISATION

Alfstore workflow framework Spécification technique

The new consumables catalogue from Medisoft is now updated. Please discover this full overview of all our consumables available to you.

Présentation Windows Azure Hadoop Big Data - BI

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Insérer des images dans Base

GIGABIT PCI DESKTOP ADAPTER DGE-530T. Quick Installation Guide+ Guide d installation+

Package Java.util Classe générique

Logitech Tablet Keyboard for Windows 8, Windows RT and Android 3.0+ Setup Guide Guide d installation

Application Form/ Formulaire de demande

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

Ocs Inventory et GLPI s appuie sur un serveur LAMP. Je vais donc commencer par installer les paquets nécessaires.

Java DataBaseConnectivity

Maîtriser le menu contextuel dans un OfficeBean

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

SERVEUR DÉDIÉ DOCUMENTATION

Paxton. ins Net2 desktop reader USB

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

SQL Historique

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Tutoriel de formation SurveyMonkey

Comment Créer une Base de Données Ab Initio

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

MELTING POTES, LA SECTION INTERNATIONALE DU BELLASSO (Association étudiante de lʼensaparis-belleville) PRESENTE :

AMENDMENT TO BILL 32 AMENDEMENT AU PROJET DE LOI 32

Android et le Cloud Computing

FileMaker 13. Guide de référence SQL

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

MySQL avec Mac OS X. Quelques manipulations avec le terminal sont nécessaires si une version de MySQL est déjà lancée:

Introduction aux Bases de Données 2004/2005

MS SQL Express 2005 Sauvegarde des données

en SCÈNE RATIONAL Rational Démonstration SDP : automatisation de la chaîne de développement Samira BATAOUCHE sbataouche@fr.ibm.com

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

Développement Web - Object Relational Mapping and Hibernate

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

Get Instant Access to ebook Cest Maintenant PDF at Our Huge Library CEST MAINTENANT PDF. ==> Download: CEST MAINTENANT PDF

I4 : Bases de Données

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

BIRT (Business Intelligence and Reporting Tools)

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Déployer et sécuriser des applica1ons mobiles dans votre SI / Cloud

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

Paris Airports - Web API Airports Path finding

Formulaire d inscription (form also available in English) Mission commerciale en Floride. Coordonnées

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

EU- Luxemburg- WHO Universal Health Coverage Partnership:

Atelier Progress Rollbase

Acce s aux applications informatiques Supply Chain Fournisseurs

Auto-évaluation Programmation en Java

Laboratoires de bases de données. Laboratoire n 6. Programmation SQL. par Danièle BAYERS et Louis SWINNEN

UN PEU DE VOTRE CŒUR EST TOUJOURS À LYON... A PIECE OF YOUR HEART IS FOREVER IN LYON...

Java Licence Professionnelle CISII,

et Active Directory Ajout, modification et suppression de comptes, extraction d adresses pour les listes de diffusion

Historisation des données

Phone Manager Soutien de l'application OCTOBER 2014 DOCUMENT RELEASE 4.1 SOUTIEN DE L'APPLICATION

Encryptions, compression et partitionnement des données

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

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

AUDIT COMMITTEE: TERMS OF REFERENCE

Transcription:

Cedric Dumoulin

Bibliographie Créez des applications pour Android https://openclassrooms.com/courses/creez-des-applicationspour-android/les-bases-de-donnees-5 Comment utiliser SQLite sous Android http://www.tutomobile.fr/comment-utiliser-sqlite-sousandroid-tutoriel-android-n%c2%b019/19/10/2010/ Simpliste, mais exemple Book! Android dev https://developer.android.com/training/basics/datastorage/databases.html https://developer.android.com/guide/topics/data/datastorage.html#db

Tutoriels Android SQLite database and content provider http://vogella.developpez.com/tutoriels/android/utilisa tion-base-donnees-sqlite/ Android ORMLite with SQLite Database Tutorial http://www.androidbegin.com/tutorial/androidormlite-with-sqlite-database-tutorial/ Les exemples dans la suite sont tirés de ces tutoriaux.

SQLite http://www.sqlite.org C est une base de données SQL embarquée Self-contained, compact (<500K) Serverless Zero-configuration Transactional SQL Open source

SQLite et Android Intégré dans chaque appareil Android Nécessite l accès au système de fichier La BD est sauvée dans un fichier /data/app_name/databases/filename DATA = chemin retourné par la méthode Environment.getDataDirectory(), APP_NAME : nom de l application. FILENAME : nom de la base de données.

Imports import android.database; // contient toutes les classes nécessaires pour travailler avec des bases de données. import android.database.sqlite; // contient les classes spécifiques à SQLite.

Les Classes de base

Les Classes de base SQLiteDatabase Objet représentant la connexion à la DB Permet la création des tables Permet la création, la modification et la suppression de données SQLiteOpenHelper Classe abstraite à sous-classer Permet la gestion du cycle de vie de la DB (Creation, ) Permet d obtenir SQLiteDatabase MySQLiteHelper Classe à fournir (extends SQLiteOpenHelper) Implémente les méthodes pour controler le cycle de vie de la DB pour créer les table dans la DB Pour mettre à jour la DB suite à un upgrade

Cycle d utilisation Ouvrir la connection à la DB Cela peut entrainer la création des tables Accéder à la DB Fermer la connection à la DB // Context is the calling activity Activity context /*= this*/; // open() - Create helper and open database MySQLiteHelper dbhelper = new MySQLiteHelper(context); SQLiteDatabase database = dbhelper.getwritabledatabase(); // Access to DB HERE //... // close() - Close helper dbhelper.close();

Créer la table Dans MySQLiteHelper public class MySQLiteHelper extends SQLiteOpenHelper { public static final String TABLE_COMMENTS = "comments"; public static final String COLUMN_ID = "_id"; public static final String COLUMN_COMMENT = "comment"; private static final String DATABASE_NAME = "commments.db"; private static final int DATABASE_VERSION = 1; // Commande sql pour la création de la base de données private static final String DATABASE_CREATE = "create table " + TABLE_COMMENTS + "(" + COLUMN_ID+ " integer primary key autoincrement, " + COLUMN_COMMENT+ " text not null );"; public MySQLiteHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); @Override public void oncreate(sqlitedatabase database) { database.execsql(database_create); @Override public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { Log.w(MySQLiteHelper.class.getName(), "Upgrading database from version " + oldversion + " to " + newversion + ", which will destroy all old data"); db.execsql("drop TABLE IF EXISTS " + TABLE_COMMENTS); oncreate(db);

Insérer des données long insert(string table, String nullcolumnhack, ContentValues values) table identifiant de la table dans laquelle insérer l'entrée. nullcolumnhack nom d'une colonne à utiliser au cas où vous souhaiteriez insérer une entrée vide. Prenez n'importe laquelle. Accept null values objet qui représente l'entrée à insérer. ContentValues ~ Map

Insérer des données Créer une ContentValues / map (nomcolonne, valeur) Insérer la map static String TABLE_COMMENTS = "COMMENT_TABLE"; static String COLUMN_COMMENT = "COMMENT"; static String COLUMN_NAME = "NAME"; String comment = "UneValeur"; // Crée un objet ContentValue utilisé pour transporter des valeurs ContentValues values = new ContentValues(); values.put(column_comment, comment); values.put(column_comment, comment); // Insert la nouvelle valeur dans la DB. Recupere l'id en retour long insertid = database.insert(table_comments, null, values);

Récupérer des données query Cursor query (boolean distinct, String table, String[] columns, String selection, String[] selectionargs, String groupby, String having, String orderby, String limit) [distinct], true = pas de résultats en double. table l'identifiant de la table. columns liste des colonnes à afficher. selection condition de selection (ex: «id=1» ou «id=?») selectionargs Args pour la selection (remplace les? ) group by pour grouper les résultats. having pour filtrer parmi les groupes. order by pour trier les résultats. ASC ou DESC [limit] pour fixer un nombre maximal de résultats voulus.

Récupérer des données Faire une query Parcourir le résultat ligne par ligne (avec le curseur) Extraire les données de la ligne Fermer le curseur public void readdata() { Cursor cursor = database.query(table_comments, {COLUMN_COMMENT, COLUMN_NAME, null, null, null, null, null); cursor.movetofirst(); while (!cursor.isafterlast()) { long id = cursor.getlong(0); String comment = cursor.getstring(1); String name = cursor.getstring(2); // assurez-vous de la fermeture du curseur cursor.close();

Supprimer des données int delete(string table, String whereclause, String[] whereargs) table identifiant de la table. whereclause ==WHERE en SQL. Clause permettant de selectionner les lignes à détruire. Ex : «id = 1» ou «id =?» ou «LIKE? AND salaire >?» whereargs tableau des valeurs qui remplaceront les «?». ex : {«1» ou {"ingenieur", "1000".

Supprimer des données int delete(string table, String whereclause, String[] whereargs) long id = 123; // L id de la ligne à supprimer System.out.println("Comment deleted with id: " + id); database.delete(table_comments, COLUMN_ID + " = " + id, null);

Data Access Object (DAO) Classe intermédiaire entre le monde objet et la BD relationnel Prend en charge la traduction Objet Table

Exemple CommentDataSource Toutes les demandes passes par le dao

Cycle de vie Créer le DAO (dans activity.oncreate() ) Accéder aux données (dans les méthodes activity.methode() ) Fermer le DAO (dans activity.onpause() ou activity.ondestroy() ) // Create DAO () datasource = new CommentsDataSource(context); // Open DB connexion datasource.open(); // Access DB List<Comment> values = datasource.getallcomments(); datasource.close();

Classe DAO (1) public class CommentsDataSource { // Champs de la base de données private SQLiteDatabase database; private MySQLiteHelper dbhelper; private String[] allcolumns = {MySQLiteHelper.COLUMN_ID, MySQLiteHelper.COLUMN_COMMENT; /** * Constructor * */ public CommentsDataSource(Context context) { dbhelper = new MySQLiteHelper(context); public void open() throws SQLException { database = dbhelper.getwritabledatabase(); public void close() { dbhelper.close();

Classe DAO (2) /** * Crée un nouvel objet en BD * * @param comment La valeur à inséré dans le nouvel objet * @return Un objet du type demandé, peuplé par les valeurs de la table. */ public Comment createcomment(string comment) { // Crée un objet ContentValue utilisé pour transporter des valeurs ContentValues values = new ContentValues(); values.put(mysqlitehelper.column_comment, comment); // Insert la nouvelle valeur dans la DB. Recupere l'id en retour long insertid = database.insert(mysqlitehelper.table_comments, null, values); // Demande la nouvelle ligne de la table Cursor cursor = database.query(mysqlitehelper.table_comments, allcolumns, MySQLiteHelper.COLUMN_ID + " = " + insertid, null, null, null, null); cursor.movetofirst(); // Crée un objet du type demandé à partir de la ligne. Comment newcomment = cursortocomment(cursor); cursor.close(); return newcomment;

Classe DAO (3) public void deletecomment(comment comment) { long id = comment.getid(); System.out.println("Comment deleted with id: " + id); database.delete(mysqlitehelper.table_comments, MySQLiteHelper.COLUMN_ID + " = " + id, null); public List<Comment> getallcomments() { List<Comment> comments = new ArrayList<Comment>(); Cursor cursor = database.query(mysqlitehelper.table_comments, allcolumns, null, null, null, null, null); cursor.movetofirst(); while (!cursor.isafterlast()) { Comment comment = cursortocomment(cursor); comments.add(comment); cursor.movetonext(); // assurez-vous de la fermeture du curseur cursor.close(); return comments; private Comment cursortocomment(cursor cursor) { Comment comment = new Comment(); comment.setid(cursor.getlong(0)); comment.setcomment(cursor.getstring(1)); return comment;

GenDROID http://gendroid.univ-pau.fr/ The GenDROID project accelerates your Android developments by providing free online data-centric generators. The generated code is intended to be pasted into your working projects, and then be reworked if needed.

Une query retourne un Cursor Il existe des SimpleCursorAdapter pour afficher le résultat dans une ListView

Le problème Comment passer du monde objet au monde relationnel? Objet Class Propriété Association Héritage Relationnel Table Colonne Identifiant Join

Equivalence classe - table En général : Une classe une table Une propriété une colonne Un objet == une ligne dans la table Association == clé et clé étrangère Exemple : la classe Département est traduite par la table DÉPARTEMENT(numéro, nom, lieu) DEPARTEMENT numero nom lieu 59 Nord 62 Pas de Calais 33 Gironde objet 40 Landes Cedric Dumoulin - IPINT 34

Exemple embarqué Une classe Adresse peut ne pas avoir de correspondance sous la forme d une table séparée dans le modèle relationnel Les attributs de la classe Adresse sont intégrés dans la table qui représente la classe Client Les objets de la classe Adresse n ont pas d identification liée à la base de données Client id client_nom adr_rue adr_ville Cedric Dumoulin - IPINT 35

ORMLite http://ormlite.com/sqlite_java_android_orm.shtml ORM = Object Relationnal Mapping Fournit un ORM pour SQLite et Android Supporte les annotations Native Ou JPA (standard persistance et ORM)

Principe Déclarer des classes entity et les annoter Générer le fichier de config correspondant Déclarer une classe helper Déclarer des DAO Utiliser les DAO

Ajouter les jars dans votre projet ORMLite necessite 2 jars: ormlite-android-x.jar ormlite-core-x.jar You may download the latest copies either from the libs directory of the attached source code or from the below URL: http://sourceforge.net/projects/ormlite/files/releases/c om/j256/ormlite/ You may download both of them and put into the libs directory of the project.

Déclarer des classes entity public class TeacherDetails implements Serializable { // Primary key defined as an auto generated integer // If the database table column name differs than // the Model class variable name, the way to map to use columnname @DatabaseField(generatedId = true, columnname = "teacher_id") protected int teacherid; // Define a String type field to hold teacher's name @DatabaseField(columnName = "teacher_name") protected String teachername; // Define a String type field to hold student's address public String address; // Default constructor is needed for the SQLite, so make sure you also have it public TeacherDetails() { //For our own purpose, so it's easier to create a TeacherDetails object public TeacherDetails(final String name, final String address) { this.teachername = name; this.address = address; // getters / setters

Générer le fichier de config correspondant ormlite_config.txt Dans res/raw Soit à la main Soit en utilisant une méthode java import com.j256.ormlite.android.apptools.ormliteconfigutil; public class DatabaseConfigUtil extends OrmLiteConfigUtil { public static void main(string[] args) throws SQLException, IOException { // Provide the name of.txt file which you have already created and kept in res/raw directory writeconfigfile("ormlite_config.txt");

res/raw ormlite_config.txt # --table-start-- dataclass=pje15.studentdirectory.data.teacherdetails tablename=teacher_details # --table-fields-start-- # --field-start-- fieldname=teacherid columnname=teacher_id generatedid=true # --field-end-- # --field-start-- fieldname=teachername columnname=teacher_name # --field-end-- # --field-start-- fieldname=address # --field-end-- # --table-fields-end-- # --table-end-- #################################

Déclarer une classe helper

Déclarer une classe helper /** * Database helper which creates and upgrades the database and provides the DAOs for the app. */ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { /************************************************ * Suggested Copy/Paste code. Everything from here to the done block. ************************************************/ private static final String DATABASE_NAME = "studentdir.db"; private static final int DATABASE_VERSION = 1; private Dao<StudentDetails, Integer> studentdao; private Dao<TeacherDetails, Integer> teacherdao; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION, R.raw.ormlite_config);

Déclarer une classe helper (2) @Override public void oncreate(sqlitedatabase sqlitedatabase, ConnectionSource connectionsource) { try { // Create tables. This oncreate() method will be invoked only once of the application life time i.e. the first time when the application starts. TableUtils.createTable(connectionSource, TeacherDetails.class); TableUtils.createTable(connectionSource, StudentDetails.class); catch (SQLException e) { Log.e(DatabaseHelper.class.getName(), "Unable to create datbases", e); @Override public void onupgrade(sqlitedatabase sqlitedatabase, ConnectionSource connectionsource, int oldver, int newver) { try { // In case of change in database of next version of application, please increase the value of DATABASE_VERSION variable, then this method will be invoked //automatically. Developer needs to handle the upgrade logic here, i.e. create a new table or a new column to an existing table, take the backups of the // existing database etc. TableUtils.dropTable(connectionSource, TeacherDetails.class, true); TableUtils.dropTable(connectionSource, StudentDetails.class, true); oncreate(sqlitedatabase, connectionsource); catch (SQLException e) { Log.e(DatabaseHelper.class.getName(), "Unable to upgrade database from version " + oldver + " to new " + newver, e);

Déclarer une classe helper (3) public Dao<TeacherDetails, Integer> getteacherdao() throws SQLException { if (teacherdao == null) { teacherdao = getdao(teacherdetails.class); return teacherdao; public Dao<StudentDetails, Integer> getstudentdao() throws SQLException { if (studentdao == null) { studentdao = getdao(studentdetails.class); return studentdao;

Utiliser dans une activity public class TeacherAddACtivity extends AppCompatActivity implements OnClickListener { // Reference of DatabaseHelper class to access its DAOs and other components private DatabaseHelper databasehelper = null; // This is how, DatabaseHelper can be initialized for future use private DatabaseHelper gethelper() { if (databasehelper == null) { databasehelper = OpenHelperManager.getHelper(this,DatabaseHelper.class); return databasehelper; @Override protected void ondestroy() { super.ondestroy(); /* * You'll need this in your class to release the helper when done. */ if (databasehelper!= null) { OpenHelperManager.releaseHelper(); databasehelper = null;

Stocker un objet TeacherDetails techdetails = new TeacherDetails(); try { // This is how, a reference of DAO object can be done final Dao<TeacherDetails, Integer> techerdao = gethelper().getteacherdao(); //This is the way to insert data into a database table techerdao.create(techdetails); catch (SQLException e) { e.printstacktrace();

Récupérer tout les objets d une classe Dao<TeacherDetails, Integer> teacherdao; teacherdao = gethelper().getteacherdao(); // Query the database. We need all the records so, used queryforall() teacherlist = teacherdao.queryforall();

Faire une query (apperçu) try { // This is how, a reference of DAO object can be done studentdao = gethelper().getstudentdao(); // Get our query builder from the DAO final QueryBuilder<StudentDetails, Integer> querybuilder = studentdao.querybuilder(); // We need only Students who are associated with the selected Teacher, so build the query by "Where" clause querybuilder.where().eq(studentdetails.teacher_id_field, tdetails.teacherid); // Prepare our SQL statement final PreparedQuery<StudentDetails> preparedquery = querybuilder.prepare(); // Fetch the list from Database by queryingit final Iterator<StudentDetails> studentsit = studentdao.query(preparedquery).iterator(); // Iterate through the StudentDetails object iterator and populate the comma separated String while (studentsit.hasnext()) { final StudentDetails sdetails = studentsit.next(); String name = sdetails.studentname; catch (SQLException e) { e.printstacktrace();

Quelques Conseils Grouper dans des packages : metier : classes metiers (Book, Author ) : db : classes liées à la DB (DAO, Helpers ) activity Réfléchissez à votre architecture! Quelle classes devez-vous concevoir? metier, dao, DbHelper, Activity DAO ou pas DAO? Utilisez des DAOs

Quelques Conseils Comment avoir une seule instance d une classe? Utiliser le pattern Singleton 5.ateliersAvancés.pdf->Partager des données entre plusieurs activités Le DbHelper doit être instancié une seule fois besoin du pattern singleton getwritabledatabase() et getreadabledatabase() peuvent être appelé plusieurs fois! https://developer.android.com/reference/android/database/sqlite/s QLiteOpenHelper.html#getWritableDatabase%28%29

Approfondir ses connaissances ou S exercer Lire : Créez des applications pour Android https://openclassrooms.com/courses/creez-des-applications-pour-android/les-basesde-donnees-5 Android dev https://developer.android.com/training/basics/data-storage/databases.html Tester : Comment utiliser SQLite sous Android http://www.tutomobile.fr/comment-utiliser-sqlite-sous-android-tutoriel-androidn%c2%b019/19/10/2010/ Aller plus loin [optionel]: Android SQLite database and content provider http://vogella.developpez.com/tutoriels/android/utilisation-base-donnees-sqlite/ Utiliser ORM Lite [optionel]: Android ORMLite with SQLite Database Tutorial http://www.androidbegin.com/tutorial/android-ormlite-with-sqlite-database-tutorial/

Ateliers Vous devez maintenant utiliser la BD SQLite dans votre projet.