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 :

[SQLite] Base de données sauvegardée ?


Sujet :

Android

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2012
    Messages : 12
    Points : 8
    Points
    8
    Par défaut [SQLite] Base de données sauvegardée ?
    Bonjour,

    ce n'est pas réellement un problème mais plus une question que je me pose car je suis actuellement sur la création d'une petite application, mais étant débutant dans l'environnement Android, je ne suis pas sûr de ce que j'ai fait.
    J'ai crée une base de donnée, et à priori je peux insérer des éléments dedans, mais je ne sais pas si cette base de donnée est réellement sauvergardée lorsque je quitte l'application.
    Après quelques tests, j'ai plutôt l'impression que oui, mais ce qui me semble bizarre, c'est qu'à chaque fois que je lance l'application, une nouvelle BDD est censé être crée et donc à mon sens, censé écraser l'ancienne BDD. La commande de création de la base de données que j'utilise est la suivante :
    DataBase db = new DataBase(this);
    (this est un type Context)

    Donc voici mes questions :
    - Faut-il faire en sorte de sérialiser la base de donnée et la stocker dans un fichier ?
    - Est-il normal que lorsque je crée une nouvelle BDD, c'est l'ancienne BDD qui est récupérée ?

    Enfin, si on a pas besoin de stocker la base de données dans un fichier extérieur, comment puis-je retrouver explicitement l'emplacement où est stocké cette base de donnée ? Car cela veut aussi dire que plus on insérera de données dans la base de donnée, plus l'application lui-même sera lourd, ce qui me semble plutôt bizarre...

    Je vous remercie par avance pour vos réponses et bonne journée à tous !


    Dyz.

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Dyz3r Voir le message
    Bonjour,
    Bonjour !
    J'ai crée une base de donnée, et à priori je peux insérer des éléments dedans, mais je ne sais pas si cette base de donnée est réellement sauvergardée lorsque je quitte l'application.
    Ca dépend...
    En général voici comment on fait pour modifier une base de données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    database.beginTransaction();
    try {
       ... inserts / updates ...
       database.setTransactionSuccessfull();
    } finally {
       database.endTransaction(); 
    }
    Si il y a une erreur pendant le insert/update, rien n'est modifié dans la DB, si tout se passe correctement, les changement sont "commited", et la base de donnée est sauvegardée.
    ..., c'est qu'à chaque fois que je lance l'application, une nouvelle BDD est censé être crée et donc à mon sens, censé écraser l'ancienne BDD. La commande de création de la base de données que j'utilise est la suivante :
    DataBase db = new DataBase(this);
    Je ne connais pas de classe "DataBase" dans Android... je connais SQLiteDatabase, qui s'ouvre avec les fonctions statiques idoines.....
    - Faut-il faire en sorte de sérialiser la base de donnée et la stocker dans un fichier ?
    Une database *est* un fichier, dont les données sont modifiables/accessibles par des requêtes.
    Est-il normal que lorsque je crée une nouvelle BDD, c'est l'ancienne BDD qui est récupérée ?
    Non, c'est juste que tu ne crée pas de nouvelle BDD...

    Car cela veut aussi dire que plus on insérera de données dans la base de donnée, plus l'application lui-même sera lourd, ce qui me semble plutôt bizarre...
    Et non, c'est tout l'interêt d'une base de donnée, permettre un accès rapide (indexé) aux données quelque soit la taille (bon bien sur plus la DB sera grosse plus ce sera long, mais une requête de 1s sur 100 valeurs, prendra 2s sur 10000 valeurs).

    Par contre si le but est de stocker des données le temps de l'application (recréer la db à chaque fois?), afin de ne pas avoir beaucoup de données, pourquoi ne pas conserver ces données en mémoire ?
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2012
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Bonjour nicroman,

    tout d'abord, je tiens à te remercier pour ta réponse éclair !
    Je vais essayer d'apporter davantage d'informations concernant mon application :

    Je ne connais pas de classe "DataBase" dans Android... je connais SQLiteDatabase, qui s'ouvre avec les fonctions statiques idoines.....
    DataBase est en fait une classe à part que j'ai crée et contient une classe private qui hérite elle-même de SQLiteOpenHelper.
    Voici le contructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	public DataBase(Context context) {
    		this.context = context;
                    // DataBaseHelper est la classe private en question
                    // j'ai déclaré une variable DBHelper afin que ma classe DataBase
                    // puisse effectuer les actions grâce à cette variable.
    		this.DBHelper = new DataBaseHelper(this.context);
    	}
    Non, c'est juste que tu ne crée pas de nouvelle BDD...
    Donc quand j'effectue la commande " DataBase db = new DataBase(this); ",
    je me contente juste de récupérer le contenu de la base de donnée déjà existante ?

    Ca dépend...
    En général voici comment on fait pour modifier une base de données:
    database.beginTransaction();
    try {
    ... inserts / updates ...
    database.setTransactionSuccessfull();
    } finally {
    database.endTransaction();
    }
    Si il y a une erreur pendant le insert/update, rien n'est modifié dans la DB, si tout se passe correctement, les changement sont "commited", et la base de donnée est sauvegardée.
    Pour ma part, je m'y suis prit assez différemment (que j'ai pêché sur un tutoriel) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	// insérer dans DB
    	public long insert(String string1, int int1, String string2) {
    		ContentValues initialValues = new ContentValues();
    		initialValues.put(COLUMN1, string1);
    		initialValues.put(COLUMN2, int1);
    		initialValues.put(COLUMN3, string2);
    		return db.insert(TABLE_NAME, null, initialValues);
    	}
    Je ne sais pas si c'est propre mais en tout cas ça marche comme il faut. Je pourrais éventuellement te communiquer la source si tu le souhaites.

    Par contre si le but est de stocker des données le temps de l'application (recréer la db à chaque fois?), afin de ne pas avoir beaucoup de données, pourquoi ne pas conserver ces données en mémoire ?
    En fait ce n'est pas du tout mon but recherché ! C'est juste que je m'attendais à ce qu'une nouvelle BD soit crée en effectuant la commande " DataBase db = new DataBase(this); ". De plus, ne sachant pas vraiment comment m'y prendre, je me suis tout simplement contenté de laisser cette commande. Mais il se trouve qu'il sait tout de même récupérer les données que j'ai inséré auparavant.

    Voilà pour ce qui est des précisions, et merci encore pour tes précieuses informations qui me permettent de mieux comprendre le mécanisme des bases de données sur Android !

  4. #4
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Dyz3r Voir le message
    Donc quand j'effectue la commande " DataBase db = new DataBase(this); ",
    je me contente juste de récupérer le contenu de la base de donnée déjà existante ?
    Je ne sais pas, tu ne montre pas le code qui ouvre justement la db...
    Si c'est SQLiteOpenHelper qui est utilisé, il doit y avoir un getReadableDatabase() et getWritableDatabase()... Dans les deux cas, les fonctions ouvrent la DB existante et n'en créent pas une nouvelle...
    L'interêt de SQLiteOpenHelper est de pouvoir gérer les mises à niveau entre plusieurs version du software... à la première ouverture... la DB n'existe pas ? onCreate est appelée, la DB existe dans une version antérieure ? onUpgrade est appelé, la DB existe dans une version postérieure ? onDowngrade est appelé....
    Pour ma part, je m'y suis prit assez différemment (que j'ai pêché sur un tutoriel)
    Ce que tu montres c'est le code d'insertion, ce que je montrais c'est le code de gestion des la transaction (autour de l'insertion)... La notion de transaction en DB est primordial pour les modifications... exemple:
    J'ai une table Catégorie de films, une table Film, et une "cross-table" entre films et catégories... (un film a une catégorie au moins)...
    Je veux rajouter un film, avec une liste de catégories...
    Hors transactions, j’insère le film, je récupère son ID, et j’insère les couples (category-id,film-id) dans la "cross-table"... Que se passe-t-il si une erreur survient pendant les insertions dans la cross-table ? Un film a moitié inséré (avec 0 ou pas toutes les catégories)...
    La transaction permet de rendre l'ensemble des insertions "atomique", ou tout est validé, ou rien ne l'est.... si une erreur se produit pendant l'insertion des couples category/film la transaction n'est pas validé, et un "rollback" est opéré, rien n'a été inséré dans la DB. Si tout se passe bien, un "commit" est opéré, et tout est sauvegardé. Ca permet d'afficher l'erreur à l'utilisateur sans doute possible: une erreur s'est produite, rien ne s'est passé.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut
    T'as méthode :
    public long insert(String string1, int int1, String string2)

    Tu peut l’appeler là dedans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    db.beginTransaction();
    try{
         db.insert(string1, int1, string2);
         db.setTransactionSuccessful();
    }
    finally{
         endTransaction();
    }
    Comme ça ça gère Commit ou Rollback.
    Keith Flint 1969 - 2019

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2012
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Je vous remercie pour vos réponses toutes aussi intéressantes !
    A nicroman :
    Je ne sais pas, tu ne montre pas le code qui ouvre justement la db...
    Si c'est SQLiteOpenHelper qui est utilisé, il doit y avoir un getReadableDatabase() et getWritableDatabase()... Dans les deux cas, les fonctions ouvrent la DB existante et n'en créent pas une nouvelle...
    J'utilise la méthode getWritableDatabase() pour ouvrir la BD (je l'ai encore une fois trouvé sur un tutoriel) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	// ouverture DB
    	public DataBase open() throws SQLException {
    		this.db = this.DBHelper.getWritableDatabase();
    		return this;
    	}
    Et pour fermer, je procède ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	// fermeture DB
    	public void close() {
    		this.DBHelper.close();
    	}
    L'interêt de SQLiteOpenHelper est de pouvoir gérer les mises à niveau entre plusieurs version du software... à la première ouverture... la DB n'existe pas ? onCreate est appelée, la DB existe dans une version antérieure ? onUpgrade est appelé, la DB existe dans une version postérieure ? onDowngrade est appelé....
    J'ignorais en effet l'existence de onDowngrade... Je peux donc me contenter d'utiliser cette méthode à chaque lancement de l'application si une base de donnée est déjà existante donc ?

    Ce que tu montres c'est le code d'insertion, ce que je montrais c'est le code de gestion des la transaction (autour de l'insertion)... La notion de transaction en DB est primordial pour les modifications... exemple:
    J'ai une table Catégorie de films, une table Film, et une "cross-table" entre films et catégories... (un film a une catégorie au moins)...
    Je veux rajouter un film, avec une liste de catégories...
    Hors transactions, j’insère le film, je récupère son ID, et j’insère les couples (category-id,film-id) dans la "cross-table"... Que se passe-t-il si une erreur survient pendant les insertions dans la cross-table ? Un film a moitié inséré (avec 0 ou pas toutes les catégories)...
    La transaction permet de rendre l'ensemble des insertions "atomique", ou tout est validé, ou rien ne l'est.... si une erreur se produit pendant l'insertion des couples category/film la transaction n'est pas validé, et un "rollback" est opéré, rien n'a été inséré dans la DB. Si tout se passe bien, un "commit" est opéré, et tout est sauvegardé. Ca permet d'afficher l'erreur à l'utilisateur sans doute possible: une erreur s'est produite, rien ne s'est passé.
    Merci pour ton exemple très complet, c'est très bien expliqué !
    Si j'ai bien compris, la méthode que tu proposes est une méthode "sécurisée" qui évite tout crash en cas d'erreur d'ajout ?

    A thierrybenji :

    T'as méthode :
    public long insert(String string1, int int1, String string2)

    Tu peut l’appeler là dedans :
    db.beginTransaction();
    try{
    db.insert(string1, int1, string2);
    db.setTransactionSuccessful();
    }
    finally{
    endTransaction();
    }
    Comme ça ça gère Commit ou Rollback.
    C'est noté, du coup je pense que je changerai un peu mon code afin de le perfectionner davantage !

    Merci encore pour vos réponses !

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

Discussions similaires

  1. [MvvmCross][SQLite] Sauvegarde de la base de données
    Par DotNET74 dans le forum Windows Phone
    Réponses: 0
    Dernier message: 17/07/2014, 07h23
  2. Sauvegarder une Base de données Oracle 8
    Par benjamin50 dans le forum Administration
    Réponses: 7
    Dernier message: 16/06/2009, 11h36
  3. Réponses: 4
    Dernier message: 03/02/2006, 12h42
  4. Problème de sauvegarde de bases de données
    Par Gwipi dans le forum Administration
    Réponses: 2
    Dernier message: 09/09/2005, 08h30
  5. Sauvegarde des bases de données
    Par dcollart dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 27/07/2005, 06h35

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