gyo2 Posté(e) 2 mars 2011 Share Posté(e) 2 mars 2011 Bonjour à tous, J’éssaye de trouver comment tester une condition sur le résultat d’une requête sql avec un if. Pour être plus clair voici ma requête : public Cursor getChamp1(String Table, String name){ return myDataBase.rawQuery("SELECT _id, champ1 FROM '"+Table+"' where champ2='"+name+"'", null); } Et mon code: public void DataBindCor(String Table, String name){ ListView listC = (ListView) this.findViewById(R.id.listC); Cursor c = db.getChamp1(Table, name); startManagingCursor(c); SimpleCursorAdapter Adpt = new SimpleCursorAdapter(this, R.layout.cor,c,new String[]{"champ1"},new int[]{R.id.txtNom}); if (((Cursor) Adpt).getString(c.getColumnIndex("champ1"))== null) { TextView noCor = (TextView)this.findViewById(R.id.noCor); noCor.setText("il n’y a pas de resultat"); } else{ listC.setAdapter(Adpt); } } Voila en gros j’essai de mettre une condition sur la colonne champ1. Si ce champ est vide j’affiche un textview sinon j’affiche une listview avec les résultats. J’ai donc un problème pour trouver ce qu’il faut mettre dans le if, j’ai essayé de mettre une condition sur le cursor et sur l’adapter mais sans succes. Si quelqu’un a une idée je suis ouvert merci Lien vers le commentaire Partager sur d’autres sites More sharing options...
fifix Posté(e) 2 mars 2011 Share Posté(e) 2 mars 2011 Je n'ai jamais fait ceci en java mais en PHP est je sais que lorsqu'un champ m'est retourné vide en faite il n'est pas null mais vide. En gros essaye de mettre =="" plutôt que ==null Lien vers le commentaire Partager sur d’autres sites More sharing options...
gyo2 Posté(e) 2 mars 2011 Auteur Share Posté(e) 2 mars 2011 J'ai déjà fait le test sur tout les cas que j'ai testé mais c'est pareil. En fait l'idée serait de pouvoir récupérer la valeur du champ et de la comparé avec ="". Mais c'est justement cette valeur que je n'arrive pas à récupérer. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arkezis Posté(e) 2 mars 2011 Share Posté(e) 2 mars 2011 Tu t'embêtes avec un adapter alors que tu n'en a à priori pas besoin ! c.moveToFirst(); c.getString(<N°DeTonChamp>); Voilà 2 méthodes qui devraient t'aider :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
gyo2 Posté(e) 2 mars 2011 Auteur Share Posté(e) 2 mars 2011 c.moveToFirst() me renvoie true dans les 2 cas (résultats et pas de résultats) et j'ai test c.getString(0), c.getString(1), c.getString(2) et dans les 3 cas ça me balance une erreur "android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1" Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 2 mars 2011 Share Posté(e) 2 mars 2011 Si le but de ton test est de vérifier si tu as des résultats ou pas pour ta requête, tu as la méthode getCount() sur le Cursor, qui te donnera le nombre d'éléments retournés par la requête PS: en PHP, on peut peut-être écrire machaine == "", mais en Java il ne faut pas, ça ne marche pas (parce que sinon on teste des références, pas des valeurs); il faut au contraire faire le test via la méthode equals : machaine.equals("") Lien vers le commentaire Partager sur d’autres sites More sharing options...
gyo2 Posté(e) 2 mars 2011 Auteur Share Posté(e) 2 mars 2011 En fait le but n'est pas de savoir si la requête renvoi ou non des résultats (il renvoi toujours un résultat), mais de savoir si le résultat qu'il renvoie a une valeur null ou une chaine de caractère. Déjà quand j'utilise un cursor.getString() j'ai une erreur et je vois pas d'où cela peut venir :rolleyes: Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 2 mars 2011 Share Posté(e) 2 mars 2011 Je n'avais pas bien fait attention, mais tu sembles faire le getString sur l'Adapter (en le castant en Cursor), alors qu'il faudrait l'appeler directement sur le Cursor; ça marcherait peut-être mieux. Lien vers le commentaire Partager sur d’autres sites More sharing options...
gyo2 Posté(e) 2 mars 2011 Auteur Share Posté(e) 2 mars 2011 Oui je suis d'accord, en fait dans le code que j'ai montrer c'était juste un test. Mais j'ai bien essayé de faire un simple c.getString(c.getColumnIndex("champ1")) pour qu'il me renvoie le string mais il me plante l'appli et me sort "android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1" et je vois pas du tout d'où sa peut venir :emo_im_undecided: Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 2 mars 2011 Share Posté(e) 2 mars 2011 J’interpréterai l'erreur comme, soit il n'y aucun élément dans la réponse, soit la colonne recherchée n'est pas présente dans le résultat. Es-tu sûr que ta requête renvoie un résultat ? tu peux sortir dans un log le résultat de l'appel à getCount() De même, tu peux afficher le résultat de l'appel à getColumnNames(), pour voir le nom des colonnes retournées par ta requête Cela devrait te permettre d'avancer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arkezis Posté(e) 2 mars 2011 Share Posté(e) 2 mars 2011 gyo2, pourrais ton voir ton code svp ? En résumé, ça devrait donner : Cursor c = db.getChamp1(Table, name); startManagingCursor(c); c.moveToFirst(); if(c.getCount()>0) c.getString(0); Lien vers le commentaire Partager sur d’autres sites More sharing options...
gyo2 Posté(e) 2 mars 2011 Auteur Share Posté(e) 2 mars 2011 Es-tu sûr que ta requête renvoie un résultat ? oui le résultat est bien affiché dans ma listview. Cela me renvoi un item qui contient la valeur de champ1 (un string ou rien). J'ai test aussi la requête a part dans un sqlite manager avec ma bdd tout est ok. tu peux afficher le résultat de l'appel à getColumnNames(), pour voir le nom des colonnes retournées par ta requête Alors j'ais tester un c.getColumnIndex("champ1") qui me renvoi 1 ensuite j'ai voulu tester l'inverse c'est a dire c.getColumnName(1) et cela me renvoie bien "champ1" tu peux sortir dans un log le résultat de l'appel à getCount() J'ai du mal à saisir le c.getCount() me renvoi bien 1 meme quand il n'y a rien dans le champ1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 2 mars 2011 Share Posté(e) 2 mars 2011 tu peux sortir dans un log le résultat de l'appel à getCount()J'ai du mal à saisir C'était un moyen pour voir le nombre de ligne de résultat de ta requête; mais puisque le résultat s'affiche bien, plus la peine... Donc, ça devrait fonctionner ! A moins que... Est-ce que tu fais bien un moveToFirst avant de récupérer le contenu de ta colonne pour la tester ?? Lien vers le commentaire Partager sur d’autres sites More sharing options...
gyo2 Posté(e) 2 mars 2011 Auteur Share Posté(e) 2 mars 2011 voici le code public class Periode extends Activity implements OnClickListener { DatabaseHelper db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.periode); db = new DatabaseHelper(this); try {db.createDataBase();}catch (IOException ioe) {throw new Error("Unable to create database");} try {db.openDataBase();}catch(SQLException sqle){throw sqle;} //recuperation des variables de l'activity père Bundle extras = getIntent().getExtras(); String Table = extras.getString("ligne"); String name = extras.getString("arret"); TextView nomTable = (TextView)this.findViewById(R.id.nomTable); nomArret.setText("Table: "+Table); TextView nomName = (TextView)this.findViewById(R.id.nomName); nomDirection.setText("Name: "+name); DataBindCor(Table, name); } public void DataBindCor(String Table, String name){ ListView listC = (ListView) this.findViewById(R.id.listC); Cursor c = db.getChamp1(Table, name); startManagingCursor(c); SimpleCursorAdapter Adpt = new SimpleCursorAdapter(this, R.layout.cor,c,new String[]{"champ1"},new int[]{R.id.txtNom}); int var=c.getColumnIndex("champ1"); String var2=c.getColumnName(var); int var3=c.getCount(); TextView noCor = (TextView)this.findViewById(R.id.noCor); noCor.setText("il n’y a pas de resultat"+var+" "+var2+" "+var3); } public void onClick(View v) { // TODO Auto-generated method stub } } je vais test avec un moveToFirst. woooo purée c'était bien sa mon getString passe maintenant ouf, Arkezis avait vu juste, en fait j'avais mi le moveToFirst après le getString c'est pour cela que ça marchait pas ou j'avais pas associer les 2 à la suite. fallait y penser merci Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arkezis Posté(e) 2 mars 2011 Share Posté(e) 2 mars 2011 Le principe est relativement simple. Lorsque tu récupères un Cursor, celui ci ne pointe pas sur le premier élément. Tu dois ainsi le déplacer avec moveToFirst() pour pouvoir manipuler tes données ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.