2017-04-22 1 views
0

J'ai mis en place une application qui peut actuellement chercher un identifiant d'entrée avec un sur la base de données pour ensuite donner un seul résultat. Par exemple. l'utilisateur entre id = 1, la base de données contient un enregistrement avec un ID de 1 puis retourne le nom ou le numéro etc ...Requête base de données avec une liste de tableau et obtenir une liste tableau de résultats retour

Maintenant, je veux améliorer le système légèrement en interrogeant ma base de données avec un arraylist qui contient une gamme d'id par exemple 3, 456, 731 etc ... que je recherche dans ma base de données. J'ai également groupé plusieurs valeurs à certains identifiants par exemple la base de données pourrait rechercher un id de 3 il trouvera alors 5 résultats Je veux qu'il renvoie le numéro de téléphone de chacun de ces résultats dans un autre arraylist que je peux imprimer aux logs .

J'espère que je l'ai suffisamment expliqué, mais s'il vous plaît poser des questions si vous avez besoin de plus d'informations.

Le code ci-dessous illustre la version modifiée de la requête utilisée pour obtenir un résultat unique, mais je ne vois pas ce que je fais de mal pour obtenir plusieurs résultats.

Activité ....

// New array list which is going to be used to store values from the database 
ArrayList<String> contactsList; 

// This arrayList has been received from another activity and contains my id's 
ArrayList<String> contacts = intent.getStringArrayListExtra("groupCode"); 

// The database which i'm using 
ContactDBHandler contactDBHandler = new ContactDBHandler(getApplicationContext(), null, null, 1); 

//getAllValues is used to pass my arraylist id's to the database. 
contactsList = contactDBHandler.GetAllValues(contacts); 


// Simple log statement to loop and display results 
for (int i = 0; i < contactsList.size(); i++){ 

     Log.i("Numbers", contactsList.get(i)); 

    } 

ContactDBHandler

Recherche

// I'm telling it to get the contact number from the contact_list 
// when the groupcode matches the code recieved. 


public ArrayList<String> GetAllValues(ArrayList groupCode) 
{ 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = null; 
    String alarmName = ""; 
    ArrayList<String> list = new ArrayList<>(); 
    cursor = db.rawQuery("SELECT contact_number FROM contact_list WHERE grp_code=?", new String[]{groupCode+ ""}); 
    if (cursor.moveToFirst()) 
    { 
     do 
     { 
      list.add(cursor.getString(0)); 
     } 
     while (cursor.moveToNext()); 
    } 
    if (cursor != null && !cursor.isClosed()) 
    { 
     cursor.close(); 
    } 

    return list; 
} 

Merci Pouvez-vous voir où je suis allé mal?

+0

Obtenez-vous une exception ou la sortie ne correspond pas au résultat attendu? –

+0

Actuellement, mes journaux sont juste vides, il suffit de tester ma liste de tableaux de contacts et je peux confirmer qu'il a l'ID en attente d'être utilisé. – user3403733

Répondre

0

Essayez ceci:

cursor = db.rawQuery("SELECT contact_number FROM contact_list WHERE grp_code IN (" + TextUtils.join(",", Collections.nCopies(groupCode.size(), "?")) + ")", groupCode.toArray(new String[groupCode.size()])); 

Votre code actuel ne passe pas la liste dans le sql format: =-t prend uniquement en charge les valeurs uniques, pour les listes, vous devez utiliser IN.


Votre code entraînerait une requête comme ceci:

SELECT contact_number FROM contact_list WHERE grp_code=["some_id","other_id"] 

Mais ce dont vous avez besoin (et mon code produit) est:

SELECT contact_number FROM contact_list WHERE grp_code IN ('some_id','other_id') 

Références:

+0

Salut F43nd1r réponse parfaite, aussi pourriez-vous juste me prendre rapidement à travers la petite section que vous avez ajouté – user3403733

+0

Désolé, je ne comprends pas. De quelle section parlez-vous? – F43nd1r

+0

Note: Edité pour éviter l'injection de sql – F43nd1r

0

Vous ne pouvez pas passer une ArrayList à une requête SQL. Pour vérifier plusieurs valeurs dans le même champ, vous devez utiliser le mot-clé 'in'.

Ex:

SELECT * FROM `table1` where column in ('element1', 'element2', 'element3') 

Dans votre cas,

String str = ""; 
for(String s: groupCode){ 
    str = str+","+"\'"+s+"\'"; 
} 
//to remove the extra ' in the begining 
str = str.substring(1); 
return str; 

cursor = db.rawQuery("SELECT contact_number FROM contact_list WHERE grp_code IN (?)", new String[]{str});