IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Importation de base de donnée MySQL dans une application


Sujet :

Android

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 139
    Points : 459
    Points
    459
    Par défaut Importation de base de donnée MySQL dans une application
    Bonjour,

    Je travaille sur un petit projet et je me heurte à un problème épineux.

    Mon application sert de catalogue pour un grossiste, qui souhaite conserver dans son téléphone l'intégralité de ses produits. Il possède un site internet avec sa propre base de donnée (MySQL).

    Niveau contrainte, l'application doit être offline. Pas moyen de taper dans la base de donnée MySQL systématiquement via des WebServices. Je ne contacte le site que le temps de mettre à jour la base locale.

    Donc voilà comment je comptais procéder :
    -Configurer la base de donnée MySQL pour qu'elle génère un backup régulier (par exemple via sqlcoredump) en fichier .sql. Éventuellement via un web service, elle génère le backup à la demande en plus.
    -Rapatrier le .sql sur le téléphone par internet. Ça se déroulerait soit en automatique à certaines heures, soit par pression d'un petit bouton.
    -L'importer dans la base de donnée SQLite interne.


    Déjà, j'aimerais l'avis de la communauté concernant cette démarche. En effet, j'ai peur que la base de donnée soit un peu trop volumineuse à rapatrier par le web (quoi que là un backup complet de la DB, incluant des données inutiles, pèse 62Ko de texte).

    De plus, comment gérer l'importation ? Je n'ai pas trouvé de solution pour générer la base de donnée SQLite sans avoir à la recréer à chaque démarrage de l'application. Y'a pas moyen de garder la base déjà créée dans un coin, plutôt que tout recréer à chaque fois ?

    Enfin, l'importation du MySQL au SQLite ne risque pas de poser quelques problèmes ? Chaque SGBD a son SQL, qui diffère toujours un chouilla...



    Quelle est la démarche envisagée en général par les professionnels pour ce genre de problématiques ?

  2. #2
    Membre habitué Avatar de Willy55
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 188
    Points : 131
    Points
    131
    Par défaut
    Salut,

    Il s'agit typiquement d'un web service, il faut mettre en place en place une architecture type REST avec un échange de données passant par du xml ou du json, ton site renvoi ces données formatées (xml, json etc...), coté android tu as un parser qui récupère les données et les insère dans une base SQLite.

    En tout cas moi je fais comme ça

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 139
    Points : 459
    Points
    459
    Par défaut
    On parle quand même d'une table recensant plusieurs centaines de produits, chacun ayant une dizaine de champs. Ca fait pas genre beaucoup pour tout envoyer par WebService ?

    Et du coup, je peux quand même les stocker dans ma base en local et pas avoir besoin de récupérer à chaque fois les données du serveur web ?

  4. #4
    Membre habitué Avatar de Willy55
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 188
    Points : 131
    Points
    131
    Par défaut
    Si tu veux un accès offline de toute façon il faudra bien que tu les récupère a un moment donné, mais tu va ne faire un gros transfert qu'une fois, après se ne sera que des "mise a jour" non ?

    Tu peux stocker tes données en local sur le téléphone grâce a une base sqlite oui bien sur, c'est ton seul moyen si tu veux de l'offline.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 139
    Points : 459
    Points
    459
    Par défaut
    Justement j'hésite... C'est moins lourd de transférer seulement les modifications de la base de donnée, mais j'ai peur du coup que ça nuise à l'intégrité des données. En rechargeant toute la table, je suis sur que c'est exactement la même que sur MySQL.

    Je sais que c'est un peu du chipotage, mais disons que c'est mon premier projet d'ampleur pour un vrai industriel, j'veux pas lui faire un truc baclé.

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Tu peux simplement via le langage serveur qui affiche le catalogue en ligne , faire un conversion mysql > sqlite.
    En gros je lis la base mysql et je réecris dans une base sqlite , c'est plus long qu'une conversion d'un dump sql mais aussi plus sur car on passe outre les différence d'implémentation du SQL en travaillant directement avec les données.

    Au moment de la synchro tu télécharges carrément une base de données qu'il te suffit ensuite d'ouvrir dans ton application.

    On peut imaginer un hash md5 à valider pour être certains que la base que tu importes est bien valide et non corrompue lors du téléchargement.

    Tant que la volumétrie de donnée à télécharger est raisonnable je m’embêterait pas à faire de la màj incrémentale , c'est beaucoup de boulot pour pas grand chose et la bdd source est peut être pas structurée pour.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 139
    Points : 459
    Points
    459
    Par défaut
    En gros, je fais un webservice qui m'envoie directement les données du MySQL en JSON puis je les réinjecte en SQLite...


    Bon bin après recherches également à coté, il semblerait que je vais pas avoir le choix au final que de faire ça...


    Merci à vous pour l'aide. Si vous avez 2/3petits conseils, n'hésitez pas .

  8. #8
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Citation Envoyé par Mouke Voir le message
    En gros, je fais un webservice qui m'envoie directement les données du MySQL en JSON puis je les réinjecte en SQLite...
    Non c'est pas ce que j'ai dit
    Ton serveur génère un fichier sqlite tous les jours à minuit par exemple et quand l'appli en à besoin tu fais un simple téléchargement http sur ce fichier qui vient remplacer l'ancien. Pas de parsing JSON ou d'insertion à faire coté appli , juste l'ouverture d'une bdd.

    En PHP ca peut se faire avec quelque chose comme ça par exemple : https://gist.github.com/ugoletti/803375
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 139
    Points : 459
    Points
    459
    Par défaut
    Mais c'est monstrueux ton truc là O_O.

    Ça se rapproche fondamentalement de mon idée originale (sauf que tu convertis la base coté web alors que j'envisageais coté java). J'aime bien le concept.

    Par contre va falloir comprendre et adapter le code.

    Merci beaucoup.

  10. #10
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Une version simplifiée que j'utilise , ça permet de spécifier quelles table extraire , ça créer donc une base sqlite uniquement avec les tables dont ont à besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    <?php
     
    //A EDITER
    $dsn    = 'mysql:host=localhost;dbname=myDB';
    $destination = 'D:\\dossier\\destination\\basesqlite.db';
    $user   = 'root';
    $pass   = '';
    $tables = array(
        'table1',
        'table2'
        //...
    );
     
    $opt    = array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' );
    $mysql  = new PDO($dsn, $user, $pass,$opt);
    $sqlite = new PDO("sqlite:$destination");
     
     
    foreach ($tables as $table) {
        convert($mysql, $sqlite, $table);
    }
     
    function convert($mysql, $sqlite, $table)
    {
        $createFields = array();
        $pkFields     = array();
        $indexFields  = array();
        $tableFields  = array();
     
        foreach ($mysql->query('SHOW COLUMNS FROM ' . $table) as $col) {
            $tableFields[] = $col["Field"];
            $fieldType     = "TEXT";
            if (stripos($col["Type"], "int(") !== false)
            {
                $fieldType = "INTEGER";
            }
            elseif (stripos($col["Type"], "datetime") !== false)
            {
                $fieldType = "DATETIME";
            }
            elseif (stripos($col["Type"], "date") !== false)
            {
                $fieldType = "DATE";
            }
     
            if ($col["Key"] == "PRI")
            {
                //$fieldType = "INTEGER";	
                $pkFields[] = $col["Field"];
            }
            else if ($col["Key"] == "MUL")
            {
                $indexFields[] = "CREATE INDEX " . $col["Field"] . "_index ON " . $table . "(" . $col["Field"] . ")";
            }
            $createFields[] = $col["Field"] . " " . $fieldType;
        }
     
        if (count($pkFields))
        {
            array_push($createFields, "PRIMARY KEY (" . implode(",", $pkFields) . ")");
        }
     
        //SQLITE
        $sqlite->exec("CREATE TABLE " . $table . " (" . implode(",", $createFields) . ")");
     
        //Insert
        $insertSqlPart = str_repeat("?,", count($tableFields));
        $insertSqlPart = substr($insertSqlPart, 0, -1);
        $insertSql     = "INSERT INTO " . $table . "(" . implode(",", $tableFields) . ") VALUES ( " . $insertSqlPart . " ) ";
        $sth           = $sqlite->prepare($insertSql);
        var_dump($insertSql, $sth);
        // get the number of records in the table
        $sthCount      = $mysql->query("SELECT count(*) FROM " . $table);
        $row           = $sthCount->fetch();
        $numRows       = $row[0];
        $sthCount->closeCursor();
     
        // read and convert all records
        $pageLength  = 100000;
        $currentPage = 0;
        $i           = 0;
     
        while (true) {
            $sqlite->beginTransaction();
            foreach ($mysql->query("SELECT * FROM " . $table . " LIMIT " . $currentPage . "," . $pageLength) as $row) {
                $params = array();
                foreach ($tableFields as $v) {
                    $params[] = $row[$v];
                }
     
                $r = $sth->execute($params);
                if (!$r)
                {
                    // error
                    echo print_r($sqlite->errorInfo(), true);
                }
     
                $i++;
            }
     
            $sqlite->commit();
     
            if ($i < $numRows)
            {
                echo ".";
                $currentPage += $pageLength;
            }
            else
            {
                break;
            }
        }
     
        // create index
        if (count($indexFields))
        {
            $sqlite->exec(implode(";", $indexFields));
        }
    }
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 139
    Points : 459
    Points
    459
    Par défaut
    Merci beaucoup, c'est super utile et assez simple à utiliser, merci .

    Edit : Par contre il me retourne une petite erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string(333) "INSERT INTO produit(Id_Produit,Tension,Type_Racc,Nb_Cond,Technique,Type_Connectique,Connectique,Desi_Connectique,Ref_Produit,Desi_Produit,Diam_Min,Diam_Max,Section,Diam_Connectique_Max_1,Diam_Connectique_Max_2,Diam_Connectique_Max_3,Diam_Connectique_Max_4,Diam_Connectique_Max_5,Pdf) VALUES ( ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ) " object(PDOStatement)#4 (1) { ["queryString"]=> string(333) "INSERT INTO produit(Id_Produit,Tension,Type_Racc,Nb_Cond,Technique,Type_Connectique,Connectique,Desi_Connectique,Ref_Produit,Desi_Produit,Diam_Min,Diam_Max,Section,Diam_Connectique_Max_1,Diam_Connectique_Max_2,Diam_Connectique_Max_3,Diam_Connectique_Max_4,Diam_Connectique_Max_5,Pdf) VALUES ( ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ) " }

  12. #12
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    C'est pas une erreur , supprime simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump($insertSql, $sth);
    dans le code php
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 139
    Points : 459
    Points
    459
    Par défaut
    Effectivement il m'a généré un fichier après le retrait de ta ligne.

    Mais il me regénère plus de fichier. Il m'en a généré un une fois, ensuite m'a refait une "erreur" comme avant, et là j'ai plus aucun résultat. Page blanche et pas de fichier.

  14. #14
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Par défaut le script n'affiche rien (donc page blanche à l'execution) à toi de le modifier pour éventuellement avoir des trace de l'execution.
    Si tu as des problèmes avec le script , il serait sans doute plus judicieux d'ouvrir une discussion coté PHP
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Nouveau Candidat au Club
    Homme Profil pro
    GERANT
    Inscrit en
    Juillet 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : GERANT
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut ksweb
    Bonjour a tout le monde;
    J'aimerai installer le serveur KSWEB pour ma tablette samsung note 10. Est ce qu'il y a quelqu'un qui pourrait m'aider? J'en serais ravis. je vous remercie de me répondre c'est urgent.

  16. #16
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 139
    Points : 459
    Points
    459
    Par défaut
    J'me suis amusé à affiché quelques trucs pour avoir un suivi Grunk de mon coté. C'était surtout le fait qu'il affiche aucune erreur et qu'il ne génère pas de fichier qui me posait problème. Mais ça fonctionne maintenant. Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/11/2012, 14h04
  2. Réponses: 5
    Dernier message: 04/10/2012, 17h44
  3. Réponses: 2
    Dernier message: 21/03/2012, 12h25
  4. Réponses: 1
    Dernier message: 31/07/2009, 08h12
  5. Connection Base de donnée mysql dans une application eclipse RCP
    Par Flowers dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 06/06/2008, 22h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo