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 :

Afficher des données de plusieurs tables dans un SimpleCursorAdapter


Sujet :

Android

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2009
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 56
    Points : 44
    Points
    44
    Par défaut Afficher des données de plusieurs tables dans un SimpleCursorAdapter
    Bonjour,

    Je reviens vers vous car j'ai un petit souci avec le développement
    d'une application.

    Je dispose d'une base sqlite fonctionnelle.

    Je souhaite récupérer des données issues de plusieurs tables.

    Aujourd'hui, je ne vois qu'une possibilité d'alimenter un "row" avec
    la méthode suivante :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String[] from = new String[]{SQLiteAdapter.CHEQUIER_ID, SQLiteAdapter.CHEQUIER_NOM, SQLiteAdapter.CHEQUIER_NUMDEBUT, SQLiteAdapter.CHEQUIER_NUMFIN};		
    		int[] to = new int[]{R.id.textViewidChequiers, R.id.textViewNomChequier, R.id.textViewDbChequier, R.id.textViewFnChequier};
     
    		cursorAdapter = new SimpleCursorAdapter(this, R.layout.rowchequier, cursor, from, to);
    En fait aujourd'hui dans R.layout.rowchequier, je ne peux afficher
    les données ne venant que d'une seule table. Or, mon besoin serait
    d'afficher des données supplémentaires venant d'autres tables.

    Savez-vous comment le faire svp ?

    Merci pour vos réponses.

  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
    Dommage c'est la construction du cursor qui aurait été interessante

    Après l'affichage des données de celui-ci est inchangé.

    Ne sachant pas exactement ce que tu veux faire, je ne peux pas aider plus, à part dire que c'est une requête SQL, donc tu fais la query que tu veux, sur une table, plusieurs (inner join, left outer join), du "group by"/"having" ...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre habitué
    Inscrit en
    Décembre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Décembre 2007
    Messages : 94
    Points : 134
    Points
    134
    Par défaut
    Tu connais les jointures? Oui? Non? Et ben voila là est ton problème. Construis ton curseur avec la bonne requête.

    Inspires toi de ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private final String MY_QUERY = "SELECT * FROM table_a a JOIN table_b b ON a.id=b.other_id WHERE b.property_id=?";
    Cursor cursor = db.rawQuery(MY_QUERY, new String[] String.valueOf(propertyId)});

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2009
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 56
    Points : 44
    Points
    44
    Par défaut
    Merci pour vos réponses.

    Je me suis mal exprimé, je vais vous donner plus de détails sur mon besoin :
    - J'ai une base de données SQLite qui contient les tables chequier et cheque.
    - 2 méthodes (entre autres) qui comptent le nombre de chèques suivant leur état.
    - 1 methode qui renvoie simplement les valeurs des champs de la table chequier.

    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
     
     
    public class SQLiteAdapter {
     
     public static final String MYDATABASE_NAME = "DettesManager";
     
     public static final String TABLE_CHEQUIER = "tableChequier";
     public static final String CHEQUIER_ID = "_id";
     public static final String CHEQUIER_DATE = "dateChequier";
     public static final String CHEQUIER_NOM = "Chequier";
     public static final String CHEQUIER_NUMDEBUT = "numDbCheque";
     public static final String CHEQUIER_NUMFIN = "numFnCheque";
     
     
     public static final String TABLE_CHEQUE = "tableCheque";
     public static final String CHEQUE_ID = "_id";
     public static final String CHEQUE_NOM = "nomChequier";
     public static final String CHEQUE_NUMERO = "numeroCheque";
     public static final String CHEQUE_ORDRE = "ordreCheque";
     public static final String CHEQUE_OPERATION = "operationCheque";
     public static final String CHEQUE_CATEGORIE = "categorieCheque";
     public static final String CHEQUE_MONTANT = "montantCheque";
     public static final String CHEQUE_DATE = "dateCheque";
     public static final String CHEQUE_COMMENTAIRE = "commentaireCheque";
     public static final String CHEQUE_ETAT = "etatCheque";
     
    /* Methode qui liste tous les chequiers */
    	public Cursor ListerChequiers(){
    		String[] columns = new String[]{CHEQUIER_ID, CHEQUIER_NOM, CHEQUIER_NUMDEBUT, CHEQUIER_NUMFIN};
    		Cursor cursorCheques = db.rawQuery("SELECT _id,Chequier,numDbCheque,numFnCheque FROM "+TABLE_CHEQUIER+" WHERE 1", null);
    		return cursorCheques;
    	}
     
    /* Methode qui renvoie le nombre de cheques vierges */
    	public long getNbChequesViergesbyNomChequier(String nomChequier){
    		long nbChequesVierges = 0;
    		String sqlCountChequesVierges = "SELECT COUNT('_id') AS nbChckVierges FROM "+TABLE_CHEQUE+" WHERE nomChequier LIKE '"+nomChequier+"' AND etatCheque NOT LIKE '%encaissé%'";
     
    		Log.d("Req_NbChckViergesinChequiers",sqlCountChequesVierges);
    		 long NbChequiers = 0;
     
    			Cursor cursor = db.rawQuery(sqlCountChequesVierges, null);
    			if (cursor.moveToFirst()) {
    				NbChequiers = Long.parseLong(cursor.getString(cursor.getColumnIndex("nbChckVierges")));
    			    cursor.close();
    			}
     
     
    		return nbChequesVierges;
    	}
     
    	/* Methode qui renvoie le nombre de cheques total */
    	public long getNbChequesUtilisesbyNomChequier(String nomChequier){
    		long nbChequesUtilises = 0;
    		String sqlCountChequesUtilises = "SELECT COUNT('_id') AS nbChckUtilises FROM "+TABLE_CHEQUE+" WHERE nomChequier LIKE '"+nomChequier+"' AND etatCheque LIKE '%encaissé%'";
     
    		Log.d("Req_NbChckUtilisesinChequiers",sqlCountChequesUtilises);
    		 long NbChequiers = 0;
     
    			Cursor cursor = db.rawQuery(sqlCountChequesUtilises, null);
    			if (cursor.moveToFirst()) {
    				NbChequiers = Long.parseLong(cursor.getString(cursor.getColumnIndex("nbChckUtilises")));
    			    cursor.close();
    			}
     
     
    		return nbChequesUtilises;
    	}
    Les seuls éléments liant les 2 tables sont les numeros de cheques de debut
    et de fin du chequier.

    Je voudrais juste afficher dans une "row-layout" les infos concernant le
    chequier et un compteur des cheques suivant leur état.

    Exemple : 7 cheques à l'etat x et 2 cheques a l'état y.

    L'etat est accessible uniquement par la table cheque et nécessite 2 requêtes
    supplémentaires, ce qui est incompatible selon moi avec le bout de code
    suivant que j'insèrerai dans l'objet chequier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cursor = mySQLiteAdapter.ListerChequiers();
     
     
    		String[] from = new String[]{SQLiteAdapter.CHEQUIER_ID, SQLiteAdapter.CHEQUIER_NOM, SQLiteAdapter.CHEQUIER_NUMDEBUT, SQLiteAdapter.CHEQUIER_NUMFIN};		
    		int[] to = new int[]{R.id.textViewidChequiers, R.id.textViewNomChequier, R.id.textViewDbChequier, R.id.textViewFnChequier};
     
    		cursorAdapter = new SimpleCursorAdapter(this, R.layout.rowchequier, cursor, from, to);
     
    		ListeChequiers.setAdapter(cursorAdapter);
    		ListeChequiers.setClickable(true);
    Auriez-vous une solution à me proposer svp ?

    Merci pour votre réactivité.

  5. #5
    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
    Oui donc tu veux faire un truc genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select etatCheque, count(*) from tableCheque where numeroCheque>=? and numeroCheque<=? group by etatCheque
    C'est bien cela ?
    Et effectivement il faut effectuer cette requête pour chaque chéquier.


    Par contre je ne comprends pas ta logique de base de donnée... A quoi correspond "nomChequier" ? pourquoi est-il dans la table "cheques" alors que tu dis que la seule relation est sur le numéro ?

    Quand à l'état du chèque je te suggère fortement de passer par un "enum" pour les valeurs possibles [disponible,détruit,emis,encaissé,refusé] (et éviter le like '%encaissé%' qui laissera passer par exemple l'état: "non encaissé" ).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  6. #6
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2009
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 56
    Points : 44
    Points
    44
    Par défaut
    Oui c'est bien ce genre de requête que je veux faire.

    Désolé j'étais pas en forme hier ;-) le champ liant les 2 tables est en effet nomCheque entre autre.

    Peux tu m'expliquer un peu plus les énum stp ?

    Merci :-)

  7. #7
    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
    L'enum est une classe spéciale qui permet une énumération de valeurs.

    Chaque entrée possède un index (ordinal()) et un nom (name()).

    Par exemple, is on a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public enum EtatCheque {
        DISPO,
        DETRUIT,
        EMIS,
        ENCAISSE,
        REFUSE
    }
    Ensuite on peut faire un code dans le genre:
    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
     
    private static final String SQL_COUNT_CHEQUE_BY_NAME_STATE = 
    "SELECT COUNT(*) FROM "+TABLE_CHEQUE+" WHERE nomChequier=? and etatCheque=?";
    public long getNumChequesByNomChequierEtat(String nomChequier, EtatCheque etat)
    {
        long ret = 0;
        Cursor cursor = null;
        try {
             cursor = db.rawQuery(SQL_COUNT_CHEQUE_BY_NAME_STATE , new String[] { nomChequier, etat.name() }); // <= a noter le passage de paramètre, permet au driver d'escaper les valeurs si nécessaire.
             if (cursor.moveToFirst()) 
                  ret = cursor.getLong(0);
        } finally {
             if (cursor != null) cursor.close();
        }
        return ret;
    }
     
    public long getNbChequesEmisbyNomChequier(String nomChequier){
        return getNumChequesByNomChequierEtat(nomChequier,EtatChequier.EMIS,EtatChequier.ENCAISSE,EtatChequier.EMIS);
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  8. #8
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2009
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 56
    Points : 44
    Points
    44
    Par défaut
    Merci Nicroman, ça me sera très utile

    Mais je viens de voir autre chose et malheureusement je ne trouve que
    peu de sujets sur le web.

    Peut-on implémenter une Custom SimpleCursorAdapter dans mon cas ?
    Cela me permettra d'envoyer plusieurs requêtes différentes et les faire
    afficher dans mes views.

    Savez-vous comment faire ?

    Désolé de mon ignorance, je ne suis pas informaticien à la base ni même
    développeur android, je suis développeur "en herbe"...

    Merci pour vos réponses.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/12/2008, 04h35
  2. Réponses: 3
    Dernier message: 17/03/2008, 10h15
  3. Réponses: 4
    Dernier message: 06/01/2007, 21h51
  4. Réponses: 10
    Dernier message: 15/09/2005, 12h31
  5. concatenation des données d'une table dans une autre
    Par Fabby69 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 04/10/2004, 11h38

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