TP Android : Utilisation de SQLite



Documents pareils
Bases de données et fournisseurs de contenu

1. Base de données SQLite

Stockage de données sous Android

OpenPaaS Le réseau social d'entreprise

TP2 : Client d une BDD SqlServer

TP SIN Programmation sur androïde Support : eclipse

Programmation Android L3 informatique

Outils, langage et approche Android Une introduction. Nicolas Stouls lyon.fr

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)

I4 : Bases de Données

CREATION WEB DYNAMIQUE

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

Programmer en JAVA. par Tama

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

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

TP Contraintes - Triggers

TP1 : Initiation à Java et Eclipse

Package Java.util Classe générique

Tp 1 correction. Structures de données (IF2)

TP au menu «UI ANDROID»

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Les fondamentaux du développement d applications Java

Héritage presque multiple en Java (1/2)

Présentation Windows Azure Hadoop Big Data - BI

Gestion de base de données

TD/TP PAC - Programmation n 3

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

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

Un ordonnanceur stupide

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

Bases de données relationnelles

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

Pratique et administration des systèmes

F. Barthélemy. 17 mai 2005

TD/TP PAC - Programmation n 3

Java Licence Professionnelle CISII,

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

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

Historisation des données

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

Programmation par les Objets en Java

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

Auto-évaluation Programmation en Java

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

Olivier Mondet

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

Interfaces graphiques avec l API Swing

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

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

TP3 : Creation de tables 1 seance

Les BASES de DONNEES dans WampServer

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

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

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)

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

Projet de programmation (IK3) : TP n 1 Correction

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Initiation à JAVA et à la programmation objet.

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

Développement Android. J.-F. Couchot

Tutoriel Android. Pour démarrer la programmation d'applications Android

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

Master Exploration Informatique des données DataWareHouse

Construire une application marketing Facebook sur la plateforme Windows Azure

Premiers Pas en Programmation Objet : les Classes et les Objets

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

Environnements de développement (intégrés)

Corrigé des exercices sur les références

Remote Method Invocation (RMI)

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

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

Education Delivery Intelligent Tool

SQL Historique

Développement sous Android

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

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

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

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

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

I. MySQL : Serveur et SGBD

Applet pour visualiser les variables «automate» notifiées

Objectifs du TP : Initiation à Access

Langage SQL : créer et interroger une base

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

A QUOI SERVENT LES BASES DE DONNÉES?

Alfstore workflow framework Spécification technique

Surveiller sa maison via son Smartphone sous Android

Administration des bases de données. Jean-Yves Antoine

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

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

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

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

TD/TP 1 Introduction au SDK d Android

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

Threads. Threads. USTL routier 1

Encryptions, compression et partitionnement des données

MODE OPERATOIRE OPENOFFICE BASE

Introduction ANDROID

Transcription:

1 TP Android : Utilisation de SQLite Vincent Dubois Android dispose d un moteur de base de données SQLite, assez proche de SQL (avec quelques simplifications et fonctionnalités en moins). L objectif de ce TP est de découvrir l utilisation de SQLite par le biais d une petite application de prise de notes. L application permettre d ajouter les notes saisies dans un éditeur à les liste de notes affichée au dessous, de la plus récente à la plus ancienne. Mise en page de l application Dans un nouveau projet, créez une activité vide et modifiez la mise en page pour avoir un EditText avec en dessous un ListView. Le plus rapide est de changer le Layout de RelativeLayout en LinearLayout (en orientation verticale). Pensez à ajuster les dimensions horizontale (mettre MatchParent), et à donner tout le poids au ListView. Il faut ensuite ajouter quelques paramètres (en mode graphique ou texte) sur l EditText : android:inputtype="text" android:imeoptions="actiondone" Le premier paramètre sert à indiquer le type de contenu. Il est important pour que Android choisisse un clavier virtuel adapté à la saisie (on utilise pas le même pour un numéro de téléphone et du texte). Le deuxième paramètre indique ce qui sera affiché sur le bouton pour valider la saisie. Création de la classe chargée de gérer la base de données La classe SQLiteOpenHelper dispose de quelques fonctions utiles pour gérer une base de données. Nous allons faire hériter la classe chargée de notre base de cette classe. Pour cela, créez une nouvelle classe appelée DbHelper. Cette classe comportera la définition de notre table, ainsi que les méthodes permettant d accéder à la base. Définition de la base Pour chaque table, on créer une classe interne à DbHelper (c est à dire une classe à l intérieur de notre classe). Le début de notre fichier va ressembler à ça : Dubois Vincent - 1 / 6-19.11.2015

2 package com.hexagonalgames.blocnote; import android.content.contentvalues; import android.content.context; import android.database.cursor; import android.database.sqlite.sqlitedatabase; import android.database.sqlite.sqliteopenhelper; import android.provider.basecolumns; /** * Created by dubois on 20/10/15. */ public class DbHelper extends SQLiteOpenHelper { public static final int DATABASE_VERSION = 1; public static final String DATABASE_NAME = "List.db"; // Définition des tables public static abstract class Note implements BaseColumns { public static final String TABLE_NAME = "note"; public static final String COLUMN_NAME_TEXT = "text"; public static final String COLUMN_NAME_DATE = "date"; On trouve ici la définition de deux constantes (le numéro de version de notre base, et le nom du fichier à utiliser), puis la classe interne Note. Dans la classe note, on définit des constantes pour le nom de la table et pour chaque champ. Le fait de définir des constantes permet d éviter les fautes de frappes : si on utilise un littéral (un valeur entre ), il faut être certain de toujours écrire exactement les noms de la même manière. Si on définit une constante, android studio complète automatiquement et nous prévient en cas d erreur. C est donc plus sur. Définition des requêtes Juste après avoir définit les tables, il faut écrire les requêtes pour la création et le vidage de la base. Le code est le suivant : // Définition des requètes en SQLite private static final String TEXT_TYPE = " TEXT"; private static final String DATE_TYPE = " INT"; private static final String COMMA_SEP = ","; private static final String SQL_CREATE_ENTRIES = "CREATE TABLE " + Note.TABLE_NAME + " (" + Note._ID + " INTEGER PRIMARY KEY" + COMMA_SEP + Note.COLUMN_NAME_TEXT+ TEXT_TYPE + COMMA_SEP + Note.COLUMN_NAME_DATE+ DATE_TYPE + " )"; private static final String SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS " + Note.TABLE_NAME; Dubois Vincent - 2 / 6-19.11.2015

3 Quelques points important à noter : SQLite dispose de peu de types (principalement int et text), il faut faire avec Encore une fois, on utilise des constantes pour les textes. Cela permet entre autres de propager automatiquement les changements de nom de champs/table sans risque d oubli. Fonctionalités minimales Notre classe héritant SQLiteOpenHelper, il faut définir un certain nombre méthodes. A part le constructeur, ces méthodes sont normalement créées automatiquement, il faut juste les remplir. Elle servent à définir le comportement à tenir lors de l évolution de la base (création, passage à une nouvelle version). L approche choisie ici est minimaliste : si on change de version, on détruit la base avant de la recréer. A noter que c est dans ce code que les requêtes que l on vient de définir vont être utilisées. public DbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); public void oncreate(sqlitedatabase db) { db.execsql(sql_create_entries); public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { db.execsql(sql_delete_entries); oncreate(db); public void ondowngrade(sqlitedatabase db, int oldversion, int newversion) { onupgrade(db, oldversion, newversion); Accès à la base Il faut enfin écrire le code permettant d ajouter une ligne, ou de consulter les lignes disponibles. Dubois Vincent - 3 / 6-19.11.2015

4 /*** * Retourne la liste actuelle * @return la liste actuelle */ public Cursor getlist() { String[] projection = { Note._ID, Note.COLUMN_NAME_TEXT, Note.COLUMN_NAME_DATE; return this.getreadabledatabase().query(note.table_name, projection, null, null, null, null, Note.COLUMN_NAME_DATE+" DESC"); /*** * Ajoute une entrée dans la table * @param text * @return */ public long insertrow(string text){ SQLiteDatabase db = getwritabledatabase(); // Create a new map of values, where column names are the keys ContentValues values = new ContentValues(); values.put(note.column_name_text, text); values.put(note.column_name_date, System.currentTimeMillis()); // Insert the new row, returning the primary key value of the new row return db.insert( Note.TABLE_NAME, null, values); Il est possible d écrire les requêtes SELECT et INSERT directement sous forme de chaînes de caractère (comme cela a été fait pour le TABLE CREATE et le DROP TABLE), mais les méthodes query() et insert() sont plus efficaces. N hésitez pas à consulter la documentation pour voir les paramètres possibles. SQLiteDatabase (Javadoc) Le fichier DbHelper.java étant maintenant complet, il ne doit plus générer d erreurs. Configuration des composants Pour que notre application fonctionne, il faut maintenant compléter notre activité afin de réaliser les tâches suivantes : Gérer la saisie d un nouveau texte. Le texte doit être ajouté dans notre base Configurer le ListView pour afficher le contenu de la base Comme d habitude, l essentiel du code à ajouter se trouve dans le oncreate(), après le setcontentview Dubois Vincent - 4 / 6-19.11.2015

5 Configuration du ListView La méthode correspond à ce que l on a déjà fait avec d autres ListView (ou GridView) : On récupère le composant, on crée un adaptateur, et on configure le composant pour qu il l utilise. Il faut, comme on l a souvent fait, créer une mise en page pour les éléments. Créez donc un fichier de layout pour les éléments (par exemple layout/element.xml) contenant un TextVIew (on suppose que son id sera @id/textview). On ajoute le code java suivant : ListView listview = (ListView) findviewbyid(r.id. listview); adapter = new SimpleCursorAdapter(this, R.layout.element, null, new String[]{ DbHelper.Note.COLUMN_NAME_TEXT, new int[]{ R.id.textView, 0); listview.setadapter(adapter); Normalement, Android studio vous indique que adapter n est pas déclaré. Corrigez l erreur en demander à créer le champ correspondant. il faut ensuite charger le contenu actuel de la base. Pour cela, il nous faut une instance de la classe que l on vient de créer, DbHelper, et s en servir pour faire notre SELECT. Voici le code : db = new DbHelper(this); adapter.changecursor(db.getlist()); Encore une fois, corrigez l erreur en faisant créer le champ (ici db). Ces deux champs nous seront utiles dans une autre méthode, pour mettre à jour la base quand on aura du texte à ajouter. Configuration de l EditText Pour écouter les évènement liés à la saisie du texte, on ajoute le code suivant : EditText edittext = (EditText) findviewbyid(r.id.edittext); edittext.setoneditoractionlistener(this); Cela provoque une erreur, notre activité (this) ne gérant pas encore ces évènements. Comme on l a déjà fait dans plusieurs TP, on utilise la complétion automatique pour implémenter l interface adaptée (alt-entrée suivi de implements ) Dubois Vincent - 5 / 6-19.11.2015

6 On complète ensuite la nouvelle méthode : public boolean oneditoraction(textview textview, int i, KeyEvent keyevent) { //On récupère le texte final String text = textview.gettext().tostring(); //On vide l'edittext textview.settext(null); //On ajoute le texte à la base avec un INSERT db.insertrow(text); //On réexécute le SELECT Cursor cursor = db.getlist(); cursor.movetofirst(); //On fait afficher ce nouveau résultat adapter.changecursor(cursor); //On indique que l'évènement a bien été géré return true; Pour aller plus loin Il s agit ici d un programme vraiment minimaliste. On pourrait rajouter par exemple les fonctionnalités suivantes (laissées en exercice) : Appels à la base de donnée en tache de fond (moyen). La base étant stoquée dans un fichier, l accès peut être un peu trop long sur certaines machines, et ralentir l interface utilisateur. La solution est d effectuer les accès à la base en tache de fond, comme cela est proposé dans ce TP Suppression d un élément (moyen). On peut ajouter un écouteur pour les clics longs sur les éléments de la liste, et demander à supprimer l élément en question. La difficulté est de récupérer l id de la ligne à effacer (il faut passer par l adapter pour récupérer le cursor, se positionner sur ligne en question, afin d obtenir l id ). L ajout de la méthode de suppression d un ligne par son id dans DbHelper est la partie la plus simple. L affichage de la date (difficile). Il faut un composant texte en plus plus pour les éléments, mais surtout créer votre propre adapter Dubois Vincent - 6 / 6-19.11.2015