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] Recherche affinée sur deux champs


Sujet :

Android

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 385
    Points : 492
    Points
    492
    Par défaut [SQLite] Recherche affinée sur deux champs
    Bonsoir ,

    Un petit souci concernant une requête SQLite
    Cette requête marche bien , mais ne me fait la recherche que pour la colonne NOMM , ce qui est correct pour une recherche global des : DUPONT .

    J'aimerais pouvoir y rajouter un critère ou deux , c'est à dire , COLUMN_NOM, COLUMN_PRENOM pour une recherche plus affinée.
    DUPONT Hervé (par exemple) et qu'il me sorte que les DUPONT hervé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public List<String> search(String query) {
    		List<String> result = new ArrayList<String>();
    		SQLiteDatabase db = getReadableDatabase();
    		final Cursor cursor = db.query(TABLE_NAME, new String[] 
    				{ COLUMN_NOM, COLUMN_NOMM , COLUMN_PRENOM , COLUMN_DATE, COLUMN_NUMERO, COLUMN_ADRESSE,COLUMN_CODEEL, COLUMN_BUREAU},
    				COLUMN_NOMM + " LIKE ?", new String[] { query }, null, null, null);
    Si vous avez une idée ,

    Je vous remercie ,
    Si ma réponse ou ma question vous semble pertinente un clique sur le pouce vert.
    La base des Expression Access à Connaitre : http://office.microsoft.com/fr-ca/ac...295.aspx?CTT=3
    Un livre de chevet parfait : "Développement Android": http://www.editions-eyrolles.com/Livre/9782212125870/

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2005
    Messages : 103
    Points : 203
    Points
    203
    Par défaut
    Bonsoir,

    J'ai peut-être mal compris la question mais tu peux faire (recherche sur NOM et PRENOM :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public List<String> search(String , String rechPrenom) {
    List<String> result = new ArrayList<String>();
    SQLiteDatabase db = getReadableDatabase();
    final Cursor cursor = db.query(TABLE_NAME, new String[] 
    { COLUMN_NOM, COLUMN_NOMM , COLUMN_PRENOM , COLUMN_DATE, COLUMN_NUMERO, COLUMN_ADRESSE,COLUMN_CODEEL, COLUMN_BUREAU},
    COLUMN_NOM + " LIKE ? AND " + COLUMN_PRENOM + " LIKE ? ", new String[] { query,  rechPrenom}, null, null, null);

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 385
    Points : 492
    Points
    492
    Par défaut
    Bonjour ,

    Merci cela répond en partie à ma question , ta solution marche en faisant 2 editText , 1 pour le Nom et 1 pour le prenom.
    Et cela marche , si on dispose du Nom + prénom (précis avec les 2eme et 3eme prénom).

    Moi j'aimerais que ce soit un peu une "option" , dans le même champ editText

    Ecrire DUPONT = sort tout les dupont
    Ecrire DUPONT eric = sort les DUPONT eric (meme si ils ont d'autre prénom)
    Exemple :
    DUPONT eric
    DUPONT eric maurice
    DUPONT eric charles francois

    J'ai essayer avec des étoiles autour du ? tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    final Cursor cursor = db.query(TABLE_NAME, new String[] 	
    { COLUMN_NOM, COLUMN_NOMM , COLUMN_PRENOM , COLUMN_DATE, COLUMN_NUMERO, COLUMN_ADRESSE,COLUMN_CODEEL, COLUMN_BUREAU},
    	COLUMN_NOM + " LIKE ? AND " + COLUMN_PRENOM + " LIKE *?* ", new String[] { query,  rechPrenom}, null, null, null);
    Mais cela plante.

    En gros j'aimerais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ma_table WHERE COLUMN_NOM LIKE ? AND (COLUMN_PRENOM LIKE ? OR null OR *?*) ;
    Une chose du genre Soit :
    - nom + le prenom ,
    - nom + null ,
    - nom + un prenom non complet.


    Du coup le SQL plus propre serait il me semble :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * FROM ma_table WHERE COLUMN_NOM LIKE ? 
    OR (COLUMN_NOM LIKE ? AND COLUMN_PRENOM LIKE ? ) 
    OR (COLUMN_NOM LIKE ? AND COLUMN_PRENOM LIKE null) 
    OR (COLUMN_NOM LIKE ? AND COLUMN_PRENOM LIKE *?*);
    Si ma réponse ou ma question vous semble pertinente un clique sur le pouce vert.
    La base des Expression Access à Connaitre : http://office.microsoft.com/fr-ca/ac...295.aspx?CTT=3
    Un livre de chevet parfait : "Développement Android": http://www.editions-eyrolles.com/Livre/9782212125870/

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 385
    Points : 492
    Points
    492
    Par défaut
    J'ai essayer quelques possibles solutions , je les mes ici pour au cas ou sa "inspirerais" quelqu'un :

    A savoir que aucun de ses essais ne marche ... !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    final Cursor cursor = db.query(TABLE_NAME, new String[] 
    	{ COLUMN_NOM, COLUMN_NOMM , COLUMN_PRENOM , COLUMN_DATE, COLUMN_NUMERO, COLUMN_ADRESSE,COLUMN_CODEEL, COLUMN_BUREAU},
    	COLUMN_NOM + " LIKE ? OR " + (COLUMN_NOM +"LIKE ? AND" + COLUMN_PRENOM + " LIKE ? "), 
    new String[] { query,  rechPrenom}, null, null, null);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	final Cursor cursor = db.query(TABLE_NAME, new String[] 
    	{ COLUMN_NOM, COLUMN_NOMM , COLUMN_PRENOM , COLUMN_DATE, COLUMN_NUMERO, COLUMN_ADRESSE,COLUMN_CODEEL, COLUMN_BUREAU},
    	(COLUMN_NOM + " LIKE ? AND "+ COLUMN_PRENOM + " LIKE null OR") + (COLUMN_NOM +" LIKE ? AND" + COLUMN_PRENOM + " LIKE ? "), 
    new String[] { query,  rechPrenom}, null, null, null);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    final Cursor cursor = db.query(TABLE_NAME, new String[] 
    	{ COLUMN_NOM, COLUMN_NOMM , COLUMN_PRENOM , COLUMN_DATE, COLUMN_NUMERO, COLUMN_ADRESSE,COLUMN_CODEEL, COLUMN_BUREAU},
    	(COLUMN_NOM + " LIKE ? AND "+ COLUMN_PRENOM + " LIKE *") +" OR " + (COLUMN_NOM +" LIKE ? AND" + COLUMN_PRENOM + " LIKE ? "),
    new String[] { query,  rechPrenom}, null, null, null);
    Et pour moi peu être le plus "prometteur" et le plus proche au final :

    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
    public List<String> search(String query, String rechPrenom) {
    	List<String> result = new ArrayList<String>();
    	SQLiteDatabase db = getReadableDatabase();
    	if (rechPrenom.equals(null)){
     
    		final Cursor cursor = db.query(TABLE_NAME, new String[] 
    				{ COLUMN_NOM, COLUMN_NOMM , COLUMN_PRENOM , COLUMN_DATE, COLUMN_NUMERO, COLUMN_ADRESSE,COLUMN_CODEEL, COLUMN_BUREAU},
    				COLUMN_NOM + " LIKE ?", new String[] { query }, null, null, null);
     
    		if (cursor.moveToFirst()) {
    			do {
    				String text = cursor.getString(COLUMN_NOM_ID) +" "+ cursor.getString(COLUMN_PRENOM_ID) 
    				+"\n Nom de naissance: "+ cursor.getString(COLUMN_NOMM_ID)
    				+"\n Date de naissance: "+ cursor.getString(COLUMN_DATE_ID)
    				+"\n Adresse: "+ cursor.getString(COLUMN_NUMERO_ID) +" "+ cursor.getString(COLUMN_ADRESSE_ID)
    				+"\n N° Electeur: "+ cursor.getString(COLUMN_CODEEL_ID)
    				+"\n Bureau: "+ cursor.getString(COLUMN_BUREAU_ID);
    				result.add(text);
    			} while (cursor.moveToNext());
    		}
    		cursor.close();
    	}
    	else {
    		final Cursor cursor = db.query(TABLE_NAME, new String[] 
    				{ COLUMN_NOM, COLUMN_NOMM , COLUMN_PRENOM , COLUMN_DATE, COLUMN_NUMERO, COLUMN_ADRESSE,COLUMN_CODEEL, COLUMN_BUREAU},
    				(COLUMN_NOM +" LIKE ? AND" + COLUMN_PRENOM + " LIKE ? "), new String[] { query,  rechPrenom}, null, null, null);
     
    		if (cursor.moveToFirst()) {
    			do {
    				String text = cursor.getString(COLUMN_NOM_ID) +" "+ cursor.getString(COLUMN_PRENOM_ID) 
    				+"\n Nom de naissance: "+ cursor.getString(COLUMN_NOMM_ID)
    				+"\n Date de naissance: "+ cursor.getString(COLUMN_DATE_ID)
    				+"\n Adresse: "+ cursor.getString(COLUMN_NUMERO_ID) +" "+ cursor.getString(COLUMN_ADRESSE_ID)
    				+"\n N° Electeur: "+ cursor.getString(COLUMN_CODEEL_ID)
    				+"\n Bureau: "+ cursor.getString(COLUMN_BUREAU_ID);
    				result.add(text);
    			} while (cursor.moveToNext());
    		}
    		cursor.close();
    	}
    EDIT :
    Pour cette dernière partie j'ai penser que cela pouvais être un problème au niveau du passage du GetText du coup dans le main j'ai fait cela :

    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
    		final EditText text = (EditText) findViewById(R.id.txt);
    		final EditText prenom = (EditText)findViewById(R.id.personne);
    		Button search = (Button) findViewById(R.id.search);
    		search.setOnClickListener(new View.OnClickListener() {
    			public void onClick(View v) {
    				searchResults.clear();
    				if(prenom.equals(null)){
    					searchResults.addAll(records.search(text.getText().toString(), null));
    					adapter.notifyDataSetChanged();
     
    				}
    				else {
    				searchResults.addAll(records.search(text.getText().toString(), prenom.getText().toString()));
    				adapter.notifyDataSetChanged();
    				}
    				}
    		});
    Qui n'a pas solutionné le problème.

    Sinon je rappel que le problème de base est : La recherche du nom + prenom dans un même editText de préférence. Ici les essais et les test ce font sur la base de l'aide d'Aerinder.

    J'ai penser aussi éventuellement à : 1 editText pour le nom et quand on effectue la recherche un deuxième editText pourrais apparaitre pour faire une nouvelle requête sur la liste de nom sortie ?!

    Exemple : DUPONT , il me sort 150 DUPONT , et me sort soit un editText pour une requête reprenant la listView + une recherche dedans.
    Soit une autocomplextextview ?

    Merci au personne qui auront réussi à lire jusqu'ici ^^ !
    Si ma réponse ou ma question vous semble pertinente un clique sur le pouce vert.
    La base des Expression Access à Connaitre : http://office.microsoft.com/fr-ca/ac...295.aspx?CTT=3
    Un livre de chevet parfait : "Développement Android": http://www.editions-eyrolles.com/Livre/9782212125870/

  5. #5
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2005
    Messages : 103
    Points : 203
    Points
    203
    Par défaut
    Peut-être passer par une vue qui permet de faire la concaténation des champs nom || prenom et faire la recherche dessus, à moins que la concaténation directement dans le where soit possible (mais me semble que c'est pas possible avec SQLite) du genre UPPER(COLUMN_NAME) || UPPER(COLUMN_PRENOM) LIKE ? COLLATE NOCASE.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 385
    Points : 492
    Points
    492
    Par défaut
    Bon j'ai trouver ... ^^ Shame on me !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    final Cursor cursor = db.query(TABLE_NAME, new String[] 
    { COLUMN_NOM, COLUMN_NOMM , COLUMN_PRENOM , COLUMN_DATE, COLUMN_NUMERO, COLUMN_ADRESSE,COLUMN_CODEEL, COLUMN_BUREAU},
    (COLUMN_NOM +" LIKE ? AND " + COLUMN_PRENOM + " LIKE ? "), new String[] { query,  rechPrenom+"%"}, null, null, null);
    Grâce à +"%".

    Ce qui rend le champs "prenom" optionnel.
    Il ne me reste plus que à étendre ma recherche à : COLUMN_NOM et COLUMN_NOMM .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    final Cursor cursor = db.query(TABLE_NAME, new String[] 
    { COLUMN_NOM, COLUMN_NOMM , COLUMN_PRENOM , COLUMN_DATE, COLUMN_NUMERO, COLUMN_ADRESSE,COLUMN_CODEEL, COLUMN_BUREAU},
    (COLUMN_NOM +" LIKE ? AND " + COLUMN_PRENOM + " LIKE ? ") + " OR " +(COLUMN_NOMM +" LIKE ? AND " + COLUMN_PRENOM + " LIKE ? "), 
    new String[] { query,  rechPrenom+"%"}, null, null, null);
    Je reviens mettre le label RESOLU ou Continuer ma quête dans peu de temps.

    EDIT : Mise en place des réponses et Label RESOLU ! La solution proposer pour mon dernier problème ne marche pas correctement et ne fait pas les choses voulu, je ne pense pas avoir le temps de corriger ce bug mineur dans le programme.

    Merci de ton temps Aerinder.
    Si ma réponse ou ma question vous semble pertinente un clique sur le pouce vert.
    La base des Expression Access à Connaitre : http://office.microsoft.com/fr-ca/ac...295.aspx?CTT=3
    Un livre de chevet parfait : "Développement Android": http://www.editions-eyrolles.com/Livre/9782212125870/

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/11/2012, 17h05
  2. Une Recherche sur deux champs
    Par souminet dans le forum Débuter
    Réponses: 8
    Dernier message: 04/11/2008, 13h56
  3. [Oracle] Recherche de doublons sur deux champs
    Par BiM dans le forum Langage SQL
    Réponses: 28
    Dernier message: 04/01/2007, 12h52
  4. pb avec select sur deux champs
    Par graphicsxp dans le forum Langage SQL
    Réponses: 7
    Dernier message: 22/03/2005, 15h30
  5. contrainte sur deux champs d'une table
    Par bdkiller dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 17/09/2004, 18h26

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