Bases de Données

Tutoriels Android

Nouveau jeu multijoueurs !

Utilisez votre Smartphone comme manette, ouvrez le site BoomBoom Fighter, et explosez vos amis !

Utilisation des Bases de Données sous Android






Introduction


Concernant le stockage des Données, il existe plusieurs solutions:

  • Mettre en place une BDD externe (MySQL, PostgreSQL, Oracle etc.)
  • Mettre en place une BDD interne: en ce qui concerne Android, il s'agit d'une BDD SQLite;
  • Stocker les données dans un fichier
Le choix du type de base dépend évidemment des utilisations que l'on va faire des données.

Il faut savoir qu'il est possible de faire tourner l'application hors ligne (le smartphone est déconnecté du net): dans ce cas là une BDD SQLite en interne s'impose. Pour mettre à jour cette base, il est possible de la synchroniser avec une base externe dès lors que la connection internet est opérationnelle. Cette mise à jour peut être effectuée automatiquement, ou à la demande de l'utilisateur.

L'avantage d'une BDD externe est l'espace de stockage des données qui peut être immense, contrairement à une BDD stockée sur le smartphone - espace de stockage limité. Cependant le temps de réponse de la BDD interne peut être largement inférieur à celui d'une BDD externe.

Il existe un troisième moyen de stocker des données, c'est la création d'un fichier de données à la compilation. Cependant les données contenues par ce fichier seront accessibles uniquement en lecture.

Cela a été utile? 153 31    -    Une suggestion? (facultatif)


Architecture avec une Base de Données Externe


D'un côté, nous avons notre application Android, d'un autre, notre base de données:

L'idée, pour faire communiquer ces deux entités, est d'utiliser un Middleware. Ce Middleware, par définition, va organiser, adapter et traiter les échanges entre l'application et la BDD.

Ces échanges sont possibles grâce à des Web Services, avec des langages d'échanges adaptés tels que JSON, ou XML.

Ci-dessous quelques tutos / liens en relation avec les Web Services:

Documentation JSON
Langage XML
Site du Zéro - Qu'est-ce qu'un Web Service?
Site du Zéro - Architectures et types de Web Services
Réflexion sur les WS SOAP & REST


Revenons au Middleware. C'est une entité qui tourne sur un serveur et qui va permettre de récupérer ou d'insérer des informations de la BDD, et de répondre aux demandes de diverses sources (par exemple notre application Android). Celui-ci peut être développé avec des technologies comme JavaEE, PHP, .NET, ...

Selon les compétences que vous avez à votre disposition, il sera plus ou moins judicieux d'utiliser l'une ou l'autre de ces technologies.

Ok, nous avons vu ici les différents composants de base. Mais comment tout cela fonctionne?

En fait, l'application va enoyer une demande via Web Service au Middleware (accessible via une URL: ce middleware tourne sur un serveur), par exemple "Je veux récupérer toutes les personnes stockées dans ma base". Le Middleware va recevoir la demande, et la traduire en requête compréhensible par la BDD, par exemple "sélectionne tout de la table personne".
Il va ensuite envoyer cette requête à la BDD, qui va renvoyer la liste des personnes. Le middleware va récupérer et adapter ces données au format souhaité par l'application android, puis renvoyer la liste des personnes à l'application, qui va les afficher.



Un peu de technique... ? :-D

Tout d'abord, juste pour donner des exemples de technologies permettant de réaliser ces échanges; il faut savoir qu'il est possible de récupérer les Web Services depuis une application mobile, mais également un site web, un client lourd, etc.:
Il existe plusieurs types d'architecture, nous prendrons ici un exemple avec un Middleware sous forme d'API REST, avec JSON en format d'échange.

Tout d'abord un petit rappel quant aux éléments qui composent l'architecture:

  • La base de données: elle contient les données, vous avez le choix quant à la technologie
  • l'API REST: équivalent du Middleware: c'est elle qui va permettre de transmettre les infos de la base de données à l'application mobile
Selon les compétences que vous avez, il est possible de développer l'API en PHP, JavaEE, .NET, ...
Voici donc quelques liens pour créer une API REST en: Pour récupérer les données JSON depuis Android, voici une fonction à intégrer et adapter dans votre application. Celle-ci se base sur la structure de données JSON ci-dessous :

Liste de personnes(nom, prénom):

        {
        "personnes": [
                { "prenom":"Bilbo" , "nom":"Lehobbit" }, 
                { "prenom":"Bob" , "nom":"Lescargot" }, 
                { "prenom":"Jack" , "nom":"Sparrow" }
            ]
        }
                
    /**
     * Récupère une liste de personnes.
     * @return ArrayList<Personne>: ou autre type de données.
     * @author François http://www.francoiscolin.fr/
     */
    public static ArrayList<Personne> getPersonnes() {
        
        ArrayList<Personne> personnes = new ArrayList<Personne>();
         
        try {
            String myurl= "http://www.exemple.com/getPersonnes";

            URL url = new URL(myurl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            InputStream inputStream = connection.getInputStream();
            /*
             * InputStreamOperations est une classe complémentaire:
             * Elle contient une méthode InputStreamToString.
             */
            String result = InputStreamOperations.InputStreamToString(inputStream);
            
            // On récupère le JSON complet
            JSONObject jsonObject = new JSONObject(result);
            // On récupère le tableau d'objets qui nous concernent
            JSONArray array = new JSONArray(jsonObject.getString("personnes"));
            // Pour tous les objets on récupère les infos
            for (int i = 0; i < array.length(); i++) {
                // On récupère un objet JSON du tableau
                JSONObject obj = new JSONObject(array.getString(i));
                // On fait le lien Personne - Objet JSON
                Personne personne = new Personne();
                personne.setNom(obj.getString("nom"));
                personne.setPrenom(obj.getString("prenom"));
                // On ajoute la personne à la liste
                personnes.add(personne);
               
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        // On retourne la liste des personnes
        return personnes;
    }

Classe complémentaire InputStreamOperations.java

package packagename;

import java.io.IOException;
import java.io.InputStream;

public class InputStreamOperations {
    
    /**
     * @param in : buffer with the php result
     * @param bufSize : size of the buffer
     * @return : the string corresponding to the buffer
     */
    public static String InputStreamToString (InputStream in, int bufSize) {         
        final StringBuilder out = new StringBuilder(); 
        final byte[] buffer = new byte[bufSize]; 
        try {
            for (int ctr; (ctr = in.read(buffer)) != -1;) {
                out.append(new String(buffer, 0, ctr));
            }
        } catch (IOException e) {
            throw new RuntimeException("Cannot convert stream to string", e);
        }
        // On retourne la chaine contenant les donnees de l'InputStream
        return out.toString(); 
    }
    
    /**
     * @param in : buffer with the php result
     * @return : the string corresponding to the buffer
     */
    public static String InputStreamToString (InputStream in) {
        // On appelle la methode precedente avec une taille de buffer par defaut
        return InputStreamToString(in, 1024);
    }

}

Cela a été utile? 65 20    -    Une suggestion? (facultatif)


Exemple d'architecture avec une Base de Données Externe MySQL


Je vais vous présenter l'architecture et le fonctionnement de l'application que j'ai pu, avec mon groupe de projet, développer dans le cadre d'un projet à l'université.

Nous avons choisi de mettre en place une Base de Données MySQL - externe donc. Voici un petit rappel de l'architecture basique d'une application Android: nous avons une interface, avec ses contrôleurs, en Java et XML.

Imaginez maintenant que nous ayons une ListeView sur l'interface (voir l'image ci-dessous):

Nous allons remonter la chaîne pour savoir d'où viennent les données affichées.

Nous sommes au niveau du contrôleur de l'interface en Java. Les données sont récupérées d'un fichier Java, nommé BDDHelper. Voyez cela comme une boîte noire. On lui dit "Je veux la liste de tous les pays, ainsi que les classements de ces pays, et leurs médailles", elle nous les renvoie, on les affiche.



On se place maintenant au niveau du BDDHelper. Celui-ci ne communique pas directement avec la Base de Données.

Il reçoit une demande "Je veux la liste des résultats du sportif Usain Bolt!".
Il va transformer cette demande en une URL - vous verrez pourquoi plus loin, et récupérer le flux de données provenant de cette URL (tous les résultats du sportif Usain Bolt).
Puis il va mettre ce flux de données dans la forme demandée (une liste), pour renvoyer... (suspens) ...La liste des résultats du sportif Usain Bolt!

Vous vous posez sûrement la question "Mais pourquoi une URL ??"

Et là, nous arrivons dans les Noires Abysses de.. non, pardon, nous arrivons sur du Php Objet.

L'URL envoyée par le BDDHelper contient le nom d'une fonction Php ainsi que ses paramètres. Via un Pattern MVC, le Php se charge de communiquer avec la BDD MySQL de sorte à récupérer les données souhaitées.
Une fois ces données récupérées, le Php renvoie ces informations au BDDHelper, et la boucle est bouclée.

Remarque: le Php envoie les données au BDDHelper sous forme d'objets JSON (JavaScript Object Notation). Le BDDHelper reçoit ces objets et les transforme pour les renvoyer au contrôleur Java.

Nous avons donc pour le moment cette architecture:



Par la suite, nous avons mis en place également une Base de Données SQLite, pour gérer la fonctionnalité « Favoris ».

Nous sommes tombés alors sur une problématique : le serveur qui hébergeait la Base de données est tombé. Or nous ne pouvions nous permettre de prendre le risque de ne pas pouvoir lire les données.

Nous avons pensé à mettre un système de « Load Balancing » (Répartition de Charge) en place, cependant les serveurs étant chez des hébergeurs privés, nous n’avions pas toutes les autorisations nécessaires au déploiement de cette structure. Nous avons donc utilisé une ruse « sioux » consistant à envoyer des Pings via HTTP, calculer les temps de réponse des serveurs, et effectuer la requête auprès du serveur le plus rapide.

Enfin, nous avons mis en place un ETL permettant d’ajouter des données depuis diverses sources dans une de nos Bases, puis nous avons instauré un système de Dump (duplication) de Bases de Données, pour synchroniser nos deux Bases.

Voici donc l’architecture finale de l’application qui en découle:



Cela a été utile? 39 6    -    Une suggestion? (facultatif)


Base de Données SQLite - Interne


Je vais être bref pour ce qui est des bases de données SQLite: il existe un tuto très bien fait, en le suivant vous ne devriez pas avoir de problème pour mettre en place une telle base. Cliquez ici pour y accéder!

Quelques conseils cependant lors de la mise en place d'une BDD SQLite:

  • Ne stockez que le strict minimum dont vous avez besoin pour votre application, au risque de prendre trop d'espace disque; En conséquences, l'application pourrait ne plus être fonctionnelle si l'espace venait à manquer, et l'utilisateur pourrait s'en désintéresser.
  • Dans le cas d'une synchronisation avec une BDD externe, essayez d'avoir un maximum de cohérence au niveau de vos modèles de données, pour limiter le traitement effectué par le Middleware ou par l'application.
  • Toujours dans le cas d'une synchronisation: effectuer celle-ci uniquement quand vous en avez besoin, en synchronisant le minimum possible de données, de sorte à optimiser le temps de transfert des données.

Cela a été utile? 144 20    -    Une suggestion? (facultatif)







*Les commentaires seront validés avant d'apparaître.

Commentaires

15 commentaire(s)
Merci
2014-06-13 19:53:57 - Par Merci
Super travail :-) Serais t-il possible d'avoir le code source ?
2014-07-01 13:54:29 - Par jon
Merci beaucoup jon :-) Pour le code source se sera délicat; je travaille cependant sur un tuto - exemple de code complet, depuis la création de la base de données externe à  la récupération des données sur Android. Je donnerai un exemple avec une couche externe en PHP, un autre avec du JavaEE. Je fais mon possible concernant les délais de publication ;-)
2014-07-02 16:24:20 - Par François
Très beau projet ! Je serai bien curieux d'essayer de faire quelque chose de similaire, avez-vous avancé dans le tutoriel ?
2015-01-27 14:09:33 - Par pecarlat
Je vous remercie pecarlat. Je n'ai malheureusement pas pu avancer pour le moment sur le tutoriel.
2015-03-18 11:46:11 - Par François
Merci bcp
2015-04-06 22:17:47 - Par asmae
merci
2015-09-16 00:43:29 - Par memed
thank you
2015-09-28 17:09:57 - Par Lover
c'est ingénieux, merci
2016-01-24 09:29:10 - Par rofinho
Super travail Serais t-il possible d'avoir le code source ?
2016-03-01 20:23:09 - Par fedoua
Merci beaucoup
2016-04-22 11:47:36 - Par tiguercha
est ce que je peut envoyé une URL à partir d'un BDDHelper codé en C# qui contient un Objet PHP et ses paramètres?, pour une application mobile Android
2016-04-22 11:57:38 - Par tiguercha
bien les gars ça m'a vraiment interré, mais j'aimerais savoir comment je faire creer une application qui va inserer les contact dans mon telephone
2016-10-20 22:17:39 - Par bison_dev
Bonjour, je trouve ce tuto très clair, merci ! Mais ça ne marche pas pour moi ... En fait, je ne comprends pas à quoi correspond l'url dans :String myurl= "http://www.exemple.com/getPersonnes";.
2017-03-19 23:36:43 - Par SOS
Bravo, très intéressant et très accessible en compréhension
2017-05-08 20:55:23 - Par nicolas
Mon profil LinkedIn Me suivre sur Twitter

Copyright FC © 2012-2014