Android ORMLite

17
antislashn.org Android - ORMLite D - 1/15 Persistance de données avec ORMLite version 1.0

description

Annexe ORMLite de mon support Android

Transcript of Android ORMLite

Page 1: Android   ORMLite

antislashn.org Android - ORMLite D - 1/15

Persistance de donnéesavec

ORMLite

version 1.0

Page 2: Android   ORMLite

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

Page 3: Android   ORMLite

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

Page 4: Android   ORMLite

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"

Page 5: Android   ORMLite

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

Page 6: Android   ORMLite

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

Page 7: Android   ORMLite

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

Page 8: Android   ORMLite

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(...), ...

Page 9: Android   ORMLite

antislashn.org Android - ORMLite D - 9/15

Codage de la classe helperpublic 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);

}@Overridepublic 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ées\n" + e);}

}@Overridepublic 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ées\n" + e);

}}

}

création de la table

suppression de la table,puis création

on étend le helper de ORMLite

Page 10: Android   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

Page 11: Android   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 DAO\n" + e);}

le helper que nous avons codé (cf. slide 9)

DAO fournit par ORMLite construit sur l'entité Task avecun identifiant de type Long

Context Android

récupération de notre helper

récupération d'un DAO ORMLite sur l'entité Task

Page 12: Android   ORMLite

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

Page 13: Android   ORMLite

antislashn.org Android - ORMLite D - 13/15

DAO ORMLite

● Certaines méthode utilisent des requêtes préparées● classes spécifiques à ORMLite

Page 14: Android   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

Page 15: Android   ORMLite

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 base\n" + e);

}return tasks;

}...

tasks = dao.queryForEq("priority", priority);

Dao<Task, Long> ORMLite

Page 16: Android   ORMLite

copyleft

Support de formation créer par

Franck SIMON

http://www.franck-simon.com

Page 17: Android   ORMLite

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.