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, CursorAdapter et Services


Sujet :

Android

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 144
    Points : 118
    Points
    118
    Par défaut SQLite, CursorAdapter et Services
    Bonjour,


    Dans mon application, j'ai une table (SQLite) qui est utilisée par une de mes classes qui étend CursorAdapter, afin de remplir une ListView. De plus, il y a un petit EditText (+ TextWatcher) au dessus de la ListView afin de filtrer la liste (effectue donc des Select à chaque fois que l'EditText est modifié). Toute cette partie marche bien.


    Cependant, j'aimerais pouvoir mettre à jour cette table à tout moment et je ne sais pas encore comment m'y prendre, en évitant surtout les problèmes d'accès multiples.

    J'ai d'abord pensé à faire un Service, qui téléchargerait puis parserait un xml sur un serveur web, dans le but de récupérer les données qu'il faudra mettre à jour dans la table.


    Par ailleurs, étant donné qu'il y a beaucoup d'insertions à faire lors des mises à jour, j'utilise actuellement des requêtes préparées ET j'exécute tout ça en une seule transaction.
    Pour expliquer le code ci-dessous, mon AsyncTask ouvre la base de données, utilise la méthode beginInsertStatement (qui démarre une transaction et compile la requête préparée), utilise preparedInsert pour chaque ligne, puis termine avec endInsertStatement pour fermer la requête préparée et la transaction.

    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
     
    	public void beginInsertStatement()
    	{
    		this.sqliteDatabase.beginTransaction();
    		this.statement = this.sqliteDatabase.compileStatement("INSERT INTO " + TABLE_NAME + " VALUES(?,?,?)");
    	}
     
     
     
    	public void preparedInsert(String id, String name, String lib)
    	{
    		this.statement.bindString(1, id);
    		this.statement.bindString(2, name);
    		this.statement.bindString(3, lib);
     
     
    		this.statement.executeInsert();
     
    		this.statement.clearBindings(); // clearBindings nécessaire ?
    	}
     
     
     
    	public void endInsertStatement()
    	{
    		this.statement.close();
    		this.sqliteDatabase.setTransactionSuccessful();
    		this.sqliteDatabase.endTransaction();
    	}

    Autre point, je n'ai qu'une seule instance de ma classe SQLiteOpenHelper :

    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
     
    public class DatabaseHelper extends SQLiteOpenHelper 
    {
     
    	private static DatabaseHelper mHelperInstance = null;
     
    public static synchronized DatabaseHelper getHelperInstance(Context context) 
    	{
    	    if (mHelperInstance == null) 
    	    {
    	    	mHelperInstance = new DatabaseHelper(context.getApplicationContext());
    	    }
     
    	    return mHelperInstance;	    
    	}

    Q1 : j'aimerais savoir si l'utilisation d'un Service pour télécharger et mettre à jour la table n'est pas "mauvaise", et s'il existe des moyens plus efficaces/plus propre ?


    Q2 : est-ce qu'il peut y avoir des problèmes si le Service met à jour la table (étant donné que la màj est effectuée en une transaction), pendant que l'utilisateur parcours la ListView / effectue des select avec le filtre ?

    Q2.5 : si le fait de tout faire en une transaction évite les problèmes avec le CursorAdapter/ListView, il faudrait que j'effectue la "vidange" de la table dans cette même transaction ? Est-ce que, pour le coup, ça poserait des problèmes aux insert effectués juste après ?


    Q3 : pour l'instant, à chaque mise à jour, je vide la table et je fais tout plein d'insert (environ 3000). Sachant que ce sera à 90% de l'update et non de l'insert, sauf la première fois où c'est de l'insert à 100%, est-ce qu'il y a un moyen plus efficace (en terme de performance), comme faire une requête "UPSERT" (Insert or replace ... / insert ... on duplicate key update ...) ?

    [EDIT Q3] : Je viens d'y penser à l'instant, mais je pense être obligé de vider la table car, lorsqu'il y a des données qui sont dans la table mais plus dans le xml, elles doivent être supprimées.


    Merci d'avance.

  2. #2
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Q1 : j'aimerais savoir si l'utilisation d'un Service pour télécharger et mettre à jour la table n'est pas "mauvaise", et s'il existe des moyens plus efficaces/plus propre ?
    Non, c'est une bonne idée, après tu peux partir sur une progress si tu veux intéragir avec une Activity particulière avec la progression du téléchargement et sa mise à jour.

    Q2 : est-ce qu'il peut y avoir des problèmes si le Service met à jour la table (étant donné que la màj est effectuée en une transaction), pendant que l'utilisateur parcours la ListView / effectue des select avec le filtre ?
    Aucun tu es asynchrone dans les deux cas (AsyncTask et Service)
    Le service Appelera l'activity pour la mettre à jour, l'AsyncTask y a accès directement.

    Pas contre niveau utilisateur il verre sa liste se remettre à jour sans lui en avoir informer
    Tu peux positionner une progress pour indiquer à l'utilisateur d'une mise à jour future ou bloquer l'accès à la ListView si tu t'aperçois que cela devient trop contraignant ( bloquage ou mise à jour fréquente).
    La mise à jour de la ListeView si elle est bien faites ne se fera que sur les View affichés du coup si tu supprimes ou modifie les views sa risque de bouger un peu.

    Q2.5 : si le fait de tout faire en une transaction évite les problèmes avec le CursorAdapter/ListView, il faudrait que j'effectue la "vidange" de la table dans cette même transaction ? Est-ce que, pour le coup, ça poserait des problèmes aux insert effectués juste après ?
    Justement si tu ne veux pas avoir des refresh complet ne fait surtout pas de vidange, met le à jour plutôt, comme je l'ai déjà dit le refresh se fait sur les Views Affichées.

    [EDIT Q3] : Je viens d'y penser à l'instant, mais je pense être obligé de vider la table car, lorsqu'il y a des données qui sont dans la table mais plus dans le xml, elles doivent être supprimées.
    Pourquoi, justement ta ListView se mettra à jour avec les données depuis ton adpater.
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

Discussions similaires

  1. Web service de recherche dans SQLite
    Par melwin dans le forum Services Web
    Réponses: 2
    Dernier message: 31/10/2013, 09h54
  2. Service et SQLite
    Par bza88 dans le forum Android
    Réponses: 1
    Dernier message: 06/06/2013, 10h01
  3. naming service
    Par manuel dans le forum CORBA
    Réponses: 6
    Dernier message: 09/12/2002, 17h43
  4. develloppement avec ORBit: service d'evenement
    Par belmontv dans le forum CORBA
    Réponses: 3
    Dernier message: 06/06/2002, 22h56
  5. Service de nommage java C++
    Par Anonymous dans le forum CORBA
    Réponses: 3
    Dernier message: 15/04/2002, 12h48

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