Android ORMLite

Franck SIMON
Franck SIMONConsultant architecte logiciel Java EE et IoT (Internet des Objets) à Transtel
antislashn.org Android - ORMLite D - 1/15
Persistance de données
avec
ORMLite
version 1.0
antislashn.org Android - ORMLite D - 2/15
Introduction
● Projet ORM en open source
● ORM : Object Relationnal Mapping
● Site du projet : http://ormlite.com/
● Supporte les bases de données JDBC et la
plateforme Android
● JDBC : Java DataBase Connectivity
● ORMLite utilise les appels natifs vers SQLite sous
Android
– le support de JDBC par Android n'est pas complet
● Packages à télécharger :
● ormlite-core.jar
● ormlite-android.jar
antislashn.org Android - ORMLite D - 3/15
Introduction
● La liaison entre une entité et la base de données
peut-être effectuée par
● annotations ORMLite
● annotations JPA
● fichier XML
● les exemples présentés utiliseront les annotations
ORMLite
– reportez-vous au projet "Todo – ORMLite"
● Les entités doivent posséder un constructeur par
défaut
antislashn.org Android - ORMLite D - 4/15
Étapes d'utilisation d'ORMLite
● Création des entités
● Codage de la classe helper
● Création des DAO
● Créer les activités
● les activités utilisent la classe OpenHelperManager
● une activité peut étendre la classe OrmLiteActivity
● Pour que les libraires ORMLite soient incluses
dans l'APK, les ajouter dans l'onglet "Order and
Export" du "Java Build Path"
● clic droit sur le projet, puis "Properties"
antislashn.org Android - ORMLite D - 5/15
Codage de l'entité
● L'entité doit comporter un constructeur par défaut
● Les annotations ORMLite utilisées sont :
● @DatabaseTable
● @DatabaseField
● @DatabaseTable : annotation de classe
● marque la classe comme étant une entité
● principal attribut
– tableName : nom de la table
antislashn.org Android - ORMLite D - 6/15
Codage de l'entité
● @DatabaseField : annotation de propriété
● l'annotation marque les propriétés devant être
sauvegardées en base
● principaux attributs
– columnName : nom de la colonne
● par défaut le nom de la propriété
– dataType : type SQL
– canBeNull : colonne nullable, vrai par défaut
– pour spécifier l'index, un des attributs suivant doit être présent
● id : index
● generatedId : auto-incrément, faux par défaut
● generatedIdSequence : séquence de nombres (selon la base)
– useGetSet : utilisation des méthodes get et set
● par défaut introspection sur les propriétés
antislashn.org Android - ORMLite D - 7/15
Codage de l'entité
● Exemple (extrait)
@DatabaseTable(tableName="tasks")
public class Task{
public static final int FAIBLE = 1;
public static final int NORMAL = 2;
public static final int URGENT = 3;
@DatabaseField(columnName="_ID", generatedId=true)
long id;
@DatabaseField(canBeNull=false)
String title;
@DatabaseField
String description;
@DatabaseField
int priority = NORMAL;
@DatabaseField(columnName="time_ms", useGetSet=true)
private long timeMs;
private Time time = new Time();
...
}
propriété non sauvegardée
nom de la table en base
clé primaire auto-incrément
utilisation des get et set
antislashn.org Android - ORMLite D - 8/15
Codage de la classe helper
● Basée sur la classe OrmLiteSqliteOpenHelper
● Gère la création et la mise à niveau de la base
● méthodes onCreate(...) et onUpgrade(...)
● Utilisée par toutes les activités de l'application
● ne pas ouvrir de multiple connexions vers la base
● utiliser OpenHelperManager qui gère les connexions
● La classe TableUtils possède des méthodes
statique de gestion des tables
● dropTable(...), clearTable(...),
createTable(...), ...
antislashn.org Android - ORMLite D - 9/15
Codage de la classe helper
public class TaskOpenHelper extends OrmLiteSqliteOpenHelper {
public static final String DB_NAME = "tasks.db";
public static final int DB_VERSION = 1;
private static final String tag = TaskOpenHelper.class.getName();
public TaskOpenHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) {
Log.i(tag,">>> création de la base de données - version "+DB_VERSION);
try {
TableUtils.createTable(connectionSource, Task.class);
} catch (SQLException e) {
Log.e(tag,">>> ERREUR de création de base de donnéesn" + e);
}
}
@Override
public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource,
int oldVersion, int newVersion) {
Log.i(tag,">>> mise à jour de la base de données - passage de "+oldVersion+" à "+newVersion);
try {
TableUtils.dropTable(connectionSource, Task.class, true);
TableUtils.createTable(connectionSource, Task.class);
} catch (SQLException e) {
Log.e(tag,">>> ERREUR de mise à jour de base de donnéesn" + e);
}
}
}
création de la table
suppression de la table,
puis création
on étend le helper de ORMLite
antislashn.org Android - ORMLite D - 10/15
Mise en place du pattern DAO
● Chaque entité possède sa classe DAO
● Data Access Object
● permet d'isoler les opérations sur la base
– pas de couplage entre l'application et la technologie de
persistance
– l'application utilise la couche DAO pour interroger la base
● le DAO fournit les méthodes de création, suppression,
mise à jour, interrogation
● Des DAO sont fournis par ORMLite
● attention la couche DAO ORMLite fournit une couche
technique, mais n'isole pas de la technologie utilisée
● votre propre couche DAO peut alors encapsuler la
couche DAO ORMLite
antislashn.org Android - ORMLite D - 11/15
Utilisation de ORMLite DAO
● Le DAO est récupéré auprès du helper
● le helper est récupéré auprès de OpenHelperManager
– permet une meilleure gestion des connexions partagées entre
les différents threads de l'application
● utilise la méthode getDao(Class<T> clazz)
– extrait de code
private TaskOpenHelper helper = null;
private Dao<Task, Long> dao = null;
private Context context;
...
if (helper == null)
helper = OpenHelperManager.getHelper(context, TaskOpenHelper.class);
try {
dao = helper.getDao(Task.class);
} catch (SQLException e) {
Log.e(tag, ">>> ERREUR d'acquisition de DAOn" + e);
}
le helper que nous avons codé (cf. slide 9)
DAO fournit par ORMLite construit sur l'entité Task avec
un identifiant de type Long
Context Android
récupération de notre helper
récupération d'un DAO ORMLite sur l'entité Task
antislashn.org Android - ORMLite D - 12/15
DAO ORMLite
● Le DAO ORMLite possède de nombreuses méthodes
● queryForID(ID id) : recherche d'une entité par son
index
● queryForAll() : récupère toutes les entités
● queryForEq(String fieldName,Object value) :
récupère les entités par rapport à une valeur de champ
● create(T data) : crée un nouvel enregistrement en base
● update(T data) : met à jour l'enregistrement lié à l'entité
● delete(T data) : supprime l’enregistrement lié à l'entité
● … cf. la documentation pour une liste exhaustive
antislashn.org Android - ORMLite D - 13/15
DAO ORMLite
● Certaines méthode utilisent des requêtes
préparées
● classes spécifiques à ORMLite
antislashn.org Android - ORMLite D - 14/15
DAO ORMLite
● Les requêtes préparées sont construites via des
fabriques
● classes DeleteBuilder, QueryBuilder,
UpdateBuilder
● les fabriques sont obtenues via le DAO ORMLite
– méthodes
● deleteBuilder(), queryBuilder(), updateBuilder()
● les fabriques possèdent des méthodes pour construire
la requête
– where(), orderBy(), …
● la méthode prepare() de la fabrique permet de
récupérer la requête préparée
antislashn.org Android - ORMLite D - 15/15
DAO ORMLite
● Exemple de requête
● extrait de code
● la requête préparée aurait pu être remplacée par
...
public List<Task> getTasksByPrirority(int priority){
List<Task> tasks = null;
QueryBuilder<Task, Long> builder = dao.queryBuilder();
try {
builder.where().eq("priority", priority);
tasks = dao.query(builder.prepare());
} catch (SQLException e) {
Log.e(tag, ">>> ERREUR de récupération depuis la basen" + e);
}
return tasks;
}
...
tasks = dao.queryForEq("priority", priority);
Dao<Task, Long> ORMLite
copyleft
Support de formation créer par
Franck SIMON
http://www.franck-simon.com
copyleft
Cette œuvre est mise à disposition sous licence
Attribution
Pas d'Utilisation Commerciale
Partage dans les Mêmes Conditions 3.0 France.
Pour voir une copie de cette licence, visitez
http://creativecommons.org/licenses/by-nc-sa/3.0/fr/
ou écrivez à
Creative Commons, 444 Castro Street, Suite 900,
Mountain View, California, 94041, USA.
1 sur 17

Recommandé

Gwt jetty et sources de données par
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de donnéesFranck SIMON
976 vues2 diapositives
Android NDK par
Android   NDKAndroid   NDK
Android NDKFranck SIMON
1.7K vues97 diapositives
Présentation1 par
Présentation1Présentation1
Présentation1Boulkenafet samir
112 vues45 diapositives
Java scripting api par
Java scripting apiJava scripting api
Java scripting apiFranck SIMON
2.3K vues96 diapositives
GWT Principes & Techniques par
GWT Principes & TechniquesGWT Principes & Techniques
GWT Principes & TechniquesRachid NID SAID
3.2K vues148 diapositives
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring par
Workshop Spring  3 - Tests et techniques avancées du conteneur SpringWorkshop Spring  3 - Tests et techniques avancées du conteneur Spring
Workshop Spring 3 - Tests et techniques avancées du conteneur SpringAntoine Rey
8K vues21 diapositives

Contenu connexe

Tendances

"Input/Ouput, 16 ans après" à Devoxx France 2012 par
"Input/Ouput, 16 ans après" à Devoxx France 2012"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012Jean-Michel Doudoux
581 vues73 diapositives
Jenkins par
JenkinsJenkins
JenkinsLhouceine OUHAMZA
369 vues50 diapositives
Retours Devoxx France 2016 par
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016Antoine Rey
9.2K vues14 diapositives
Installation et configuration d'openbravo par
Installation et configuration d'openbravoInstallation et configuration d'openbravo
Installation et configuration d'openbravoSoumia Brabije
3K vues19 diapositives
Devoxx 2018 Après Java 8, Java 9 et 10 par
Devoxx 2018 Après Java 8, Java 9 et 10Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10Jean-Michel Doudoux
1.1K vues66 diapositives
Microbox : Ma toolbox microservices - Julien Roy par
Microbox : Ma toolbox microservices - Julien RoyMicrobox : Ma toolbox microservices - Julien Roy
Microbox : Ma toolbox microservices - Julien Royekino
1.7K vues79 diapositives

Tendances(20)

Retours Devoxx France 2016 par Antoine Rey
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016
Antoine Rey9.2K vues
Installation et configuration d'openbravo par Soumia Brabije
Installation et configuration d'openbravoInstallation et configuration d'openbravo
Installation et configuration d'openbravo
Soumia Brabije3K vues
Microbox : Ma toolbox microservices - Julien Roy par ekino
Microbox : Ma toolbox microservices - Julien RoyMicrobox : Ma toolbox microservices - Julien Roy
Microbox : Ma toolbox microservices - Julien Roy
ekino1.7K vues
Ces outils qui vous font gagner du temps par Antoine Rey
Ces outils qui vous font gagner du tempsCes outils qui vous font gagner du temps
Ces outils qui vous font gagner du temps
Antoine Rey9K vues
Introduction à spring boot par Antoine Rey
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
Antoine Rey17.8K vues
JDBC: Gestion des bases de données en Java par Youness Boukouchi
JDBC: Gestion des bases de données en Java JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java
Youness Boukouchi2.7K vues
Accès aux bases de données via jdbc par Rachid Lajouad
Accès aux bases de données via jdbcAccès aux bases de données via jdbc
Accès aux bases de données via jdbc
Rachid Lajouad931 vues
Automatisez vos tâches répétitives avec Grunt (Blend 2013) par Corinne Schillinger
Automatisez vos tâches répétitives avec Grunt (Blend 2013)Automatisez vos tâches répétitives avec Grunt (Blend 2013)
Automatisez vos tâches répétitives avec Grunt (Blend 2013)

En vedette

Introduction à Hibernate p.1 par
Introduction à Hibernate p.1Introduction à Hibernate p.1
Introduction à Hibernate p.1ATHMAN HAJ-HAMOU
1K vues29 diapositives
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La... par
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...dbi services
2.1K vues32 diapositives
Presentació assamblea par
Presentació assamblea Presentació assamblea
Presentació assamblea FC Barcelona
5.5K vues23 diapositives
Què ha fet ICV-EUiA amb el meu vot? par
Què ha fet ICV-EUiA amb el meu vot?Què ha fet ICV-EUiA amb el meu vot?
Què ha fet ICV-EUiA amb el meu vot?iniciativaverds
1.3K vues20 diapositives
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013 par
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013Daniel Rehn
1.8K vues93 diapositives
Présentation LMAX Disruptor So@t par
Présentation LMAX Disruptor So@tPrésentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tFrancois Ostyn
1.2K vues32 diapositives

En vedette(20)

SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La... par dbi services
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
dbi services2.1K vues
Presentació assamblea par FC Barcelona
Presentació assamblea Presentació assamblea
Presentació assamblea
FC Barcelona5.5K vues
Què ha fet ICV-EUiA amb el meu vot? par iniciativaverds
Què ha fet ICV-EUiA amb el meu vot?Què ha fet ICV-EUiA amb el meu vot?
Què ha fet ICV-EUiA amb el meu vot?
iniciativaverds1.3K vues
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013 par Daniel Rehn
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
Daniel Rehn1.8K vues
Présentation LMAX Disruptor So@t par Francois Ostyn
Présentation LMAX Disruptor So@tPrésentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@t
Francois Ostyn1.2K vues
Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung II par Daniel Rehn
Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung IICampus M21 | Medienpraxis III: Online / Social Media - Vorlesung II
Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung II
Daniel Rehn1.5K vues
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev. par MongoDB
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
MongoDB2K vues
Atelier agile 2009_09_27 par domidp
Atelier agile 2009_09_27Atelier agile 2009_09_27
Atelier agile 2009_09_27
domidp731 vues
Apresentação Java Web Si Ufc Quixadá par Zarathon Maia
Apresentação Java Web Si Ufc QuixadáApresentação Java Web Si Ufc Quixadá
Apresentação Java Web Si Ufc Quixadá
Zarathon Maia1.1K vues
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman par jonesshipman
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & ShipmanDominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
jonesshipman837 vues
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013 par Daniel Rehn
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
Daniel Rehn1.7K vues
Ligação do Flex a um backend LAMP usando AMFPHP par elliando dias
Ligação do Flex a um backend LAMP usando AMFPHPLigação do Flex a um backend LAMP usando AMFPHP
Ligação do Flex a um backend LAMP usando AMFPHP
elliando dias1.2K vues
Lean Kanban FR 2013 - Vin et kanban par Julien Fallet
Lean Kanban FR 2013 - Vin et kanbanLean Kanban FR 2013 - Vin et kanban
Lean Kanban FR 2013 - Vin et kanban
Julien Fallet2.1K vues

Similaire à Android ORMLite

3-android.pdf par
3-android.pdf3-android.pdf
3-android.pdfFethiBenYahia1
36 vues47 diapositives
Linq et Entity framework par
Linq et Entity frameworkLinq et Entity framework
Linq et Entity frameworkDNG Consulting
3.2K vues48 diapositives
Java Database Connectivity par
Java Database ConnectivityJava Database Connectivity
Java Database ConnectivityKorteby Farouk
1.4K vues42 diapositives
Procédures CLR pour SQL Server : avantages et inconvénients par
Procédures CLR pour SQL Server : avantages et inconvénientsProcédures CLR pour SQL Server : avantages et inconvénients
Procédures CLR pour SQL Server : avantages et inconvénientsDenis Voituron
855 vues23 diapositives
Marzouk une introduction à jdbc par
Marzouk une introduction à jdbcMarzouk une introduction à jdbc
Marzouk une introduction à jdbcabderrahim marzouk
63 vues27 diapositives
Modèle de domaine riche dans une application métier complexe un exemple pratique par
Modèle de domaine riche dans une application métier complexe un exemple pratiqueModèle de domaine riche dans une application métier complexe un exemple pratique
Modèle de domaine riche dans une application métier complexe un exemple pratiqueVladyslav Riabchenko
1.1K vues60 diapositives

Similaire à Android ORMLite(20)

Procédures CLR pour SQL Server : avantages et inconvénients par Denis Voituron
Procédures CLR pour SQL Server : avantages et inconvénientsProcédures CLR pour SQL Server : avantages et inconvénients
Procédures CLR pour SQL Server : avantages et inconvénients
Denis Voituron855 vues
Modèle de domaine riche dans une application métier complexe un exemple pratique par Vladyslav Riabchenko
Modèle de domaine riche dans une application métier complexe un exemple pratiqueModèle de domaine riche dans une application métier complexe un exemple pratique
Modèle de domaine riche dans une application métier complexe un exemple pratique
Workshop spring session 2 - La persistance au sein des applications Java par Antoine Rey
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
Antoine Rey10.4K vues
201303 - Java8 par lyonjug
201303 - Java8201303 - Java8
201303 - Java8
lyonjug677 vues
Symfony2 - Un Framework PHP 5 Performant par Hugo Hamon
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Hugo Hamon3.1K vues
Mappingobjetrelationnel[1] par linasafaa
Mappingobjetrelationnel[1]Mappingobjetrelationnel[1]
Mappingobjetrelationnel[1]
linasafaa556 vues
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen... par Tarik Zakaria Benmerar
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro par Olivier Mallassi
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -introNosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
PostgreSQL, plus qu'une base de données, une plateforme aux multiples usages par Open Source Experience
PostgreSQL, plus qu'une base de données, une plateforme aux multiples usagesPostgreSQL, plus qu'une base de données, une plateforme aux multiples usages
PostgreSQL, plus qu'une base de données, une plateforme aux multiples usages

Plus de Franck SIMON

Distribuer une librairie via maven par
Distribuer une librairie via mavenDistribuer une librairie via maven
Distribuer une librairie via mavenFranck SIMON
622 vues15 diapositives
Java 9 modules par
Java 9    modulesJava 9    modules
Java 9 modulesFranck SIMON
532 vues19 diapositives
Java 8 - lambda par
Java 8 - lambdaJava 8 - lambda
Java 8 - lambdaFranck SIMON
611 vues20 diapositives
Java 8 - interfaces par
Java 8 - interfacesJava 8 - interfaces
Java 8 - interfacesFranck SIMON
458 vues34 diapositives
Java 8 - DateTime par
Java 8 - DateTimeJava 8 - DateTime
Java 8 - DateTimeFranck SIMON
500 vues15 diapositives
Java 8 - collections et stream par
Java 8 - collections et streamJava 8 - collections et stream
Java 8 - collections et streamFranck SIMON
1.5K vues29 diapositives

Plus de Franck SIMON(15)

Distribuer une librairie via maven par Franck SIMON
Distribuer une librairie via mavenDistribuer une librairie via maven
Distribuer une librairie via maven
Franck SIMON622 vues
Java 8 - collections et stream par Franck SIMON
Java 8 - collections et streamJava 8 - collections et stream
Java 8 - collections et stream
Franck SIMON1.5K vues
Description d'un fichier de prélèvements SEPA minimum par Franck SIMON
Description d'un fichier de prélèvements SEPA minimumDescription d'un fichier de prélèvements SEPA minimum
Description d'un fichier de prélèvements SEPA minimum
Franck SIMON29.1K vues
Tomcat and apache httpd training par Franck SIMON
Tomcat and apache httpd trainingTomcat and apache httpd training
Tomcat and apache httpd training
Franck SIMON28K vues
Java - programmation concurrente par Franck SIMON
Java - programmation concurrenteJava - programmation concurrente
Java - programmation concurrente
Franck SIMON2.6K vues
Android Input Method Editor par Franck SIMON
Android   Input Method EditorAndroid   Input Method Editor
Android Input Method Editor
Franck SIMON3.9K vues
Architectures distribuées par Franck SIMON
Architectures distribuéesArchitectures distribuées
Architectures distribuées
Franck SIMON10K vues
Développement Android par Franck SIMON
Développement AndroidDéveloppement Android
Développement Android
Franck SIMON27.7K vues

Android ORMLite

  • 1. antislashn.org Android - ORMLite D - 1/15 Persistance de données avec ORMLite version 1.0
  • 2. antislashn.org Android - ORMLite D - 2/15 Introduction ● Projet ORM en open source ● ORM : Object Relationnal Mapping ● Site du projet : http://ormlite.com/ ● Supporte les bases de données JDBC et la plateforme Android ● JDBC : Java DataBase Connectivity ● ORMLite utilise les appels natifs vers SQLite sous Android – le support de JDBC par Android n'est pas complet ● Packages à télécharger : ● ormlite-core.jar ● ormlite-android.jar
  • 3. antislashn.org Android - ORMLite D - 3/15 Introduction ● La liaison entre une entité et la base de données peut-être effectuée par ● annotations ORMLite ● annotations JPA ● fichier XML ● les exemples présentés utiliseront les annotations ORMLite – reportez-vous au projet "Todo – ORMLite" ● Les entités doivent posséder un constructeur par défaut
  • 4. antislashn.org Android - ORMLite D - 4/15 Étapes d'utilisation d'ORMLite ● Création des entités ● Codage de la classe helper ● Création des DAO ● Créer les activités ● les activités utilisent la classe OpenHelperManager ● une activité peut étendre la classe OrmLiteActivity ● Pour que les libraires ORMLite soient incluses dans l'APK, les ajouter dans l'onglet "Order and Export" du "Java Build Path" ● clic droit sur le projet, puis "Properties"
  • 5. antislashn.org Android - ORMLite D - 5/15 Codage de l'entité ● L'entité doit comporter un constructeur par défaut ● Les annotations ORMLite utilisées sont : ● @DatabaseTable ● @DatabaseField ● @DatabaseTable : annotation de classe ● marque la classe comme étant une entité ● principal attribut – tableName : nom de la table
  • 6. antislashn.org Android - ORMLite D - 6/15 Codage de l'entité ● @DatabaseField : annotation de propriété ● l'annotation marque les propriétés devant être sauvegardées en base ● principaux attributs – columnName : nom de la colonne ● par défaut le nom de la propriété – dataType : type SQL – canBeNull : colonne nullable, vrai par défaut – pour spécifier l'index, un des attributs suivant doit être présent ● id : index ● generatedId : auto-incrément, faux par défaut ● generatedIdSequence : séquence de nombres (selon la base) – useGetSet : utilisation des méthodes get et set ● par défaut introspection sur les propriétés
  • 7. antislashn.org Android - ORMLite D - 7/15 Codage de l'entité ● Exemple (extrait) @DatabaseTable(tableName="tasks") public class Task{ public static final int FAIBLE = 1; public static final int NORMAL = 2; public static final int URGENT = 3; @DatabaseField(columnName="_ID", generatedId=true) long id; @DatabaseField(canBeNull=false) String title; @DatabaseField String description; @DatabaseField int priority = NORMAL; @DatabaseField(columnName="time_ms", useGetSet=true) private long timeMs; private Time time = new Time(); ... } propriété non sauvegardée nom de la table en base clé primaire auto-incrément utilisation des get et set
  • 8. antislashn.org Android - ORMLite D - 8/15 Codage de la classe helper ● Basée sur la classe OrmLiteSqliteOpenHelper ● Gère la création et la mise à niveau de la base ● méthodes onCreate(...) et onUpgrade(...) ● Utilisée par toutes les activités de l'application ● ne pas ouvrir de multiple connexions vers la base ● utiliser OpenHelperManager qui gère les connexions ● La classe TableUtils possède des méthodes statique de gestion des tables ● dropTable(...), clearTable(...), createTable(...), ...
  • 9. antislashn.org Android - ORMLite D - 9/15 Codage de la classe helper public class TaskOpenHelper extends OrmLiteSqliteOpenHelper { public static final String DB_NAME = "tasks.db"; public static final int DB_VERSION = 1; private static final String tag = TaskOpenHelper.class.getName(); public TaskOpenHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) { Log.i(tag,">>> création de la base de données - version "+DB_VERSION); try { TableUtils.createTable(connectionSource, Task.class); } catch (SQLException e) { Log.e(tag,">>> ERREUR de création de base de donnéesn" + e); } } @Override public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int oldVersion, int newVersion) { Log.i(tag,">>> mise à jour de la base de données - passage de "+oldVersion+" à "+newVersion); try { TableUtils.dropTable(connectionSource, Task.class, true); TableUtils.createTable(connectionSource, Task.class); } catch (SQLException e) { Log.e(tag,">>> ERREUR de mise à jour de base de donnéesn" + e); } } } création de la table suppression de la table, puis création on étend le helper de ORMLite
  • 10. antislashn.org Android - ORMLite D - 10/15 Mise en place du pattern DAO ● Chaque entité possède sa classe DAO ● Data Access Object ● permet d'isoler les opérations sur la base – pas de couplage entre l'application et la technologie de persistance – l'application utilise la couche DAO pour interroger la base ● le DAO fournit les méthodes de création, suppression, mise à jour, interrogation ● Des DAO sont fournis par ORMLite ● attention la couche DAO ORMLite fournit une couche technique, mais n'isole pas de la technologie utilisée ● votre propre couche DAO peut alors encapsuler la couche DAO ORMLite
  • 11. antislashn.org Android - ORMLite D - 11/15 Utilisation de ORMLite DAO ● Le DAO est récupéré auprès du helper ● le helper est récupéré auprès de OpenHelperManager – permet une meilleure gestion des connexions partagées entre les différents threads de l'application ● utilise la méthode getDao(Class<T> clazz) – extrait de code private TaskOpenHelper helper = null; private Dao<Task, Long> dao = null; private Context context; ... if (helper == null) helper = OpenHelperManager.getHelper(context, TaskOpenHelper.class); try { dao = helper.getDao(Task.class); } catch (SQLException e) { Log.e(tag, ">>> ERREUR d'acquisition de DAOn" + e); } le helper que nous avons codé (cf. slide 9) DAO fournit par ORMLite construit sur l'entité Task avec un identifiant de type Long Context Android récupération de notre helper récupération d'un DAO ORMLite sur l'entité Task
  • 12. antislashn.org Android - ORMLite D - 12/15 DAO ORMLite ● Le DAO ORMLite possède de nombreuses méthodes ● queryForID(ID id) : recherche d'une entité par son index ● queryForAll() : récupère toutes les entités ● queryForEq(String fieldName,Object value) : récupère les entités par rapport à une valeur de champ ● create(T data) : crée un nouvel enregistrement en base ● update(T data) : met à jour l'enregistrement lié à l'entité ● delete(T data) : supprime l’enregistrement lié à l'entité ● … cf. la documentation pour une liste exhaustive
  • 13. antislashn.org Android - ORMLite D - 13/15 DAO ORMLite ● Certaines méthode utilisent des requêtes préparées ● classes spécifiques à ORMLite
  • 14. antislashn.org Android - ORMLite D - 14/15 DAO ORMLite ● Les requêtes préparées sont construites via des fabriques ● classes DeleteBuilder, QueryBuilder, UpdateBuilder ● les fabriques sont obtenues via le DAO ORMLite – méthodes ● deleteBuilder(), queryBuilder(), updateBuilder() ● les fabriques possèdent des méthodes pour construire la requête – where(), orderBy(), … ● la méthode prepare() de la fabrique permet de récupérer la requête préparée
  • 15. antislashn.org Android - ORMLite D - 15/15 DAO ORMLite ● Exemple de requête ● extrait de code ● la requête préparée aurait pu être remplacée par ... public List<Task> getTasksByPrirority(int priority){ List<Task> tasks = null; QueryBuilder<Task, Long> builder = dao.queryBuilder(); try { builder.where().eq("priority", priority); tasks = dao.query(builder.prepare()); } catch (SQLException e) { Log.e(tag, ">>> ERREUR de récupération depuis la basen" + e); } return tasks; } ... tasks = dao.queryForEq("priority", priority); Dao<Task, Long> ORMLite
  • 16. copyleft Support de formation créer par Franck SIMON http://www.franck-simon.com
  • 17. copyleft Cette œuvre est mise à disposition sous licence Attribution Pas d'Utilisation Commerciale Partage dans les Mêmes Conditions 3.0 France. Pour voir une copie de cette licence, visitez http://creativecommons.org/licenses/by-nc-sa/3.0/fr/ ou écrivez à Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.