Aller au contenu

condition sur resultat requete sql


Recommended Posts

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

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

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

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

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

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

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

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

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

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

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

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...