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 :

problème de requete sur BDD


Sujet :

Android

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Points : 7
    Points
    7
    Par défaut problème de requete sur BDD
    Bonjour, voici mon problème:

    Dans une base de données "Fruit" j'ai divers champ dont un qui me sert de dénomination "Nom" (il continent le nom du fruit) le champ suivant est nommé "Couleur" (descriptif de la ou les couleurs du fruit) puis une suite de champs (sans importance pour mon exemple). Ce champ Couleur peut par exemple dans le cas d'une pomme contenir plusieurs valeurs (jaune,rouge,verte) séparées par des virgules.

    Jusque la pas de souci, cependant je souhaiterai faire une requête qui me sortirait tous les "Nom" de ma BDD "Fruit" qui peuvent être de "Couleur" rouge.

    j ai donc fait usage d'une requête du type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    String recherche = "rouge";
    Cursor c = bdd.query(TABLE_Fruit, new String[] {
                    // liste de champs a récupérer
                    ID, Nom, Couleur, ...}
                    // la requête de recherche 
                    , Couleur + " LIKE \"" + recherche +"\"", null, null, null, null);
    return cursorDeFiche(c);
    Et la en fait je me trouve face a 2 problèmes:

    - premièrement cette requête ne peut retourner qu'un seul fruit, alors que je voudrais la liste des fruits qui peuvent être rouge.

    - ensuite elle ne me retourne qu'un fruit qui ne peut que être rouge, comme la fraise. En fait elle retourne un fruit dont le champ "Couleur" ne continent que la valeur rouge tout seul.

    Donc si une âme charitable pouvait me dire comment on peut effectuer la recherche de façon a obtenir la liste de tous les fruits qui peuvent être au moins rouge ca m'arrangerai fortement :-) d'autant que je vais devoir faire usage de ce genre choses dans bien des circonstances.

    Je dois bien reconnaitre que j'ai un peu de mal avec sqlite en version android :-( d'autant que j ai un peu de mal a trouver de la documentations qui soit en français car pour le coup en anglais ca reste très obscur ^^. Je ne suis pas anglophobe mais pour le coup j ai du mal.

    Voilou, merci d'avance pour votre patience.

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur Web et Mobile
    Inscrit en
    Juin 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web et Mobile

    Informations forums :
    Inscription : Juin 2010
    Messages : 76
    Points : 65
    Points
    65
    Par défaut
    Personnellement, je reverrai ta base de données car il est pas normal que tu est un champs dans lequel tu as plusieurs couleurs séparé par des virgules...

    Après je me suis pas plongé dans la requête à faire parce que je pense que tu n'es pas sur une bonne base déjà. Revoie ta BDD et tu ne rencontrera pas ce genre de problème.

  3. #3
    Membre actif Avatar de chpil
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 143
    Points : 212
    Points
    212
    Par défaut
    Un like fait une sélection par rapport à un pattern. Dans ton cas, il ne sélectionne que les lignes qui ont exactement la valeur 'rouge' dans la colonne correspondante, car ton pattern n'est pas variable. Il faudrait que tu rajoutes '%' devant et derrière 'rouge' pour sélectionner les lignes qui contiennent 'rouge' dans la colonne, que la valeur soit en début/milieu ou fin de la chaine
    D'autre part, utilise plutôt le passage des paramètres pour la construction de la requête, pour que la librairie sqlite fasse l'escaping des valeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    String recherche = "rouge";
    Cursor c = bdd.query(TABLE_Fruit, new String[] {
    // liste de champs a récupérer
    ID, Nom, Couleur, ...}
    // la requête de recherche 
    , Couleur + " LIKE ?", new String[] { "%"+recherche+"%"}, null, null, null);
    return cursorDeFiche(c);

  4. #4
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Merci, je vais essayer ca mercredi je vous tiens au courant.

  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
    Mais c'est très moyen comme solution.... Ca peut éventuellement fonctionner avec couleurs (quoique).... mais sinon, il faut pouvoir chercher "rouge" tout en excluant "rougeatre".... et un like '%rouge%' va sortir le rougeatre...

    Le plus classique en SGBD est d'avoir une table de couleurs, et une table de correspondances Fruit<->Couleur (n,n)
    La recherce se fait alors par:

    select f.* from FruitCouleur c
    inner join Fruit f on f.ID_=c.Fruit_ID
    where c.Couleur = 'rouge'

    Avec une bonne indexation la requete peut etre 10x plus rapide qu'un like (qui risque de faire un full table scan tout le temps).

  6. #6
    Futur Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Merci pour toutes ces infos, mon problème est résolu

    Pour ce qui est de l'élégance j'en convient on est loin d'y être

    Je note bien la proposition d'amélioration et j'en tiendrai compte dans d'autre circonstance, cependant j'avais juste besoin de faire une petite recherche au cœur d'un champ et de façon la plus simple qui soit. De plus il s'agit d'un tout petit programme avec une petite BDD et je ne devrais pas avoir de souci du genre rouge - rougeâtre. D'autre part l'histoire des fruits était pour fixer un exemple très compréhensif Mais en tous cas merci pour vos réponses très pertinentes

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

Discussions similaires

  1. Probléme de requete sur 2 tables jointées
    Par Geoffbulbe dans le forum Débuter
    Réponses: 4
    Dernier message: 11/03/2013, 12h41
  2. Problème avec JOB sur BDD ORACLE en DBLINK
    Par fcapliez dans le forum PL/SQL
    Réponses: 4
    Dernier message: 06/10/2010, 09h51
  3. Problème de requete sur un champ qui s'appele "table"
    Par yann123456 dans le forum Requêtes
    Réponses: 2
    Dernier message: 16/03/2009, 12h26
  4. Collisions de requetes sur bdd MySQL
    Par lysandre dans le forum Requêtes
    Réponses: 17
    Dernier message: 07/12/2007, 11h25
  5. [phpMyAdmin] Problème de connexion sur BDD avec phpMyAdmin 2.8.0.2
    Par romca dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 21/03/2006, 15h35

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