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
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.