2016-05-11 1 views
-1

J'ai fait une application en eclipse pour android où vous pouvez remplir les informations d'une personne comme le nom, email, adresse, etc. Dans cette application, je dois inclure un bouton de recherche, qui va chercher une personne qui est enregistrée dans le base de données lorsqu'une ou plusieurs informations sont connues. Par exemple. Lorsque je me souviens seulement de l'adresse e-mail d'une personne enregistrée dans la base de données, je dois être en mesure de trouver cette personne en cherchant un e-mail correspondant. Ce code je pour le faire:Pourquoi la requête rawquery dans ma base de données sqlite me donne-t-elle la mauvaise personne?

public Person getPerson(String naam, String adres, String email, String geslacht, 
     String leeftijd, String geboortedatum){ 
    SQLiteDatabase db= this.getReadableDatabase(); 
    Cursor curs=db.rawQuery("SELECT * FROM personen WHERE name = ? OR adress = ? " 
      + "OR email = ? OR gender = ? OR age = ? OR birthday = ?", 
      new String[]{naam==null?"'":naam, adres==null?"'":adres, 
        email==null?"'":email, geslacht==null?"'":geslacht, 
          leeftijd==null?"'":leeftijd, geboortedatum==null?"'":geboortedatum}); 
    if(curs!=null) 
     curs.moveToFirst(); 

La raison pour laquelle je l'ai changé les args [] quand il a inclus une valeur nulle est que sinon le rawQuery ne fonctionnera pas. Ce code, cependant, ne renvoie pas la personne que je cherchais, mais il renvoie simplement la toute première personne dans la base de données. Lorsque simplifier le code en faisant la recherche de requête pour un nom de personnes seulement il ne fait retourner la personne avec ce nom:

Cursor curs=db.rawQuery("SELECT * FROM personen WHERE name = ?", new String[]{naam}); 
if(curs!=null) 
    curs.moveToFirst(); 

Quel est le problème avec la première rawQuery et pourquoi ne pas renvoyer la personne que je » Je cherche, mais simplement la première personne dans la base de données, alors que la deuxième rawQuery renvoie la bonne personne?

+0

retournera seulement la première rangée, donc vous devez faire un temps –

+0

vous avez des personnes avec des propriétés en commun. regarde la taille de ton curseur. – njzk2

+0

curs.moveToFirst(); retourner seulement la première ligne du résultat –

Répondre

0

Je suppose que le problème est avec le OU. Pourriez-vous essayer ET et voir? Parce que OU est généralement facultatif. Ce que je veux dire par optionnel, c'est que vous dites à sql engine de renvoyer la personne avec l'un de ces attributs. Donc, vous ne restreignez pas, mais donnez beaucoup de possibilité abd OU finit avec de nombreux utilisateurs et par conséquent son obtenir le premier. Ne pas utiliser OU. Essayez de créer une requête qui renvoie un résultat unique souhaité. 'Ou' retournera la première ligne où l'une des conditions est vérifiée, mais votre 'curs.moveToFirst();'

+0

Je pensais que ce serait quelque chose comme ça, mais avec ET je reçois une erreur. C'est probablement parce que les valeurs nulles sont vraiment stockées comme des valeurs nulles dans la base de données, mais j'ai donné une autre valeur aux paramètres dans les args [] lorsqu'elles étaient nulles, donc il n'y aura jamais de correspondance exacte avec les valeurs dans la base de données . C'est pourquoi j'ai choisi d'utiliser OR, car je pensais que je ne chercherais que les paramètres correspondants dans ce cas. –

+0

OK. Alors pourquoi ne pas chercher celui avec des valeurs Ou j'ai une idée que vous pouvez rechercher où N'est PAS NUL. comme: SELECT * FROM table O WH YourColumn n'est pas NULL; Donc, il considérera ou comparera celui avec des valeurs seulement. –

0
public Person getPerson(String naam, String adres, String email, String geslacht, 
      String leeftijd, String geboortedatum){ 
     SQLiteDatabase db= this.getReadableDatabase(); 
     Cursor curs=db.rawQuery("SELECT * FROM personen WHERE name = ? OR adress = ? " 
       + "OR email = ? OR gender = ? OR age = ? OR birthday = ?", 
       new String[]{naam==null?"'":naam, adres==null?"'":adres, 
         email==null?"'":email, geslacht==null?"'":geslacht, 
           leeftijd==null?"'":leeftijd, geboortedatum==null?"'":geboortedatum}); 
     if(curs!=null) 
      if (curs.moveToFirst()){ 
       while(curs.hasNext){ 
//Your code, this will return all the rows of your sql,use curs.next() to get a row 
}