1
votes

Erreur avec le curseur lors du chargement des détails de la base de données

Je travaille actuellement sur un projet scolaire, j'essaie de créer un responsable de groupe scout. C'est la première fois que j'utilise Java, XML ou Android Studio, donc les progrès ont été un peu lents, mais j'y arrive. Le problème que j'ai en ce moment est avec l'extraction des détails du Scout d'une base de données, afin qu'ils soient placés dans un spinner. Le chef sélectionnera ensuite les scouts qu'il souhaite inviter, par leur nom, à partir de la roulette. Le code qui est apparemment à l'origine de l'erreur (dans la classe du gestionnaire de base de données) est ci-dessous:

01-24 18:39:38.228 18179-18179/com.example.atomi.scoutmanagerprototype E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.atomi.scoutmanagerprototype, PID: 18179
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.atomi.scoutmanagerprototype/com.example.atomi.scoutmanagerprototype.frmCreateEvent2}: java.lang.IllegalArgumentException: Cannot bind argument at index 6 because the index is out of range.  The statement has 1 parameters.
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2314)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2386)
    at android.app.ActivityThread.access$800(ActivityThread.java:148)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5310)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
 Caused by: java.lang.IllegalArgumentException: Cannot bind argument at index 6 because the index is out of range.  The statement has 1 parameters.
    at android.database.sqlite.SQLiteProgram.bind(SQLiteProgram.java:212)
    at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:166)
    at android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:200)
    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
    at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1163)
    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1034)
    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1202)
    at com.example.atomi.scoutmanagerprototype.databaseHandler.GetAllScouts(databaseHandler.java:395)
    at com.example.atomi.scoutmanagerprototype.frmCreateEvent2.loadSpinnerData(frmCreateEvent2.java:87)
    at com.example.atomi.scoutmanagerprototype.frmCreateEvent2.onCreate(frmCreateEvent2.java:82)
    at android.app.Activity.performCreate(Activity.java:5953)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1128)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2267)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2386) 
    at android.app.ActivityThread.access$800(ActivityThread.java:148) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5310) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 

Et les informations du logcat sont à nouveau ci-dessous:

public Cursor GetAllScouts()
{
    String whereClause = COLUMN_SECTION + "=?";
    String[] whereArgs = new String[]{"Beavers","Cubs","Scouts","Explorers","Network","Leaders"};
    String[] columns = new String[]{COLUMN_SCID + " AS " + BaseColumns._ID, COLUMN_FNAME, COLUMN_LNAME, COLUMN_SECTION};
    return db.query(TABLE_SCOUTS,columns,whereClause,whereArgs,null,null,null);//Error is being thrown up here
}


0 commentaires

3 Réponses :


0
votes

La liste doit-elle être modifiable? Sinon, vous pouvez simplement spécifier un tableau de chaînes dans votre fichier strings.xml dans vos ressources, comme ceci:

strings.xml

Spinner spinner=(Spinner)findViewById(R.id.spinner);

String[] scoutCategories = getResources().getStringArray(R.array.scout_categories);        

ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, R.layout.spinner_layout, R.id.text, countries);

spinner.setAdapter(adapter);

Ensuite, quel que soit l'endroit où vous configurez votre objet Spinner :

SomeActivity.java

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array
        name="scout_categories">
        <item>Beavers</item>
        <item>Cubs</item>
        <item>Scouts</item>
        <item>Explorers</item>
        <item>Network</item>
        <item>Leaders</item>
    </string-array>
</resources>

* Voir ici pour utiliser ArrayAdapter

Maintenant, s'il DOIT être une liste mutable, alors je suggérez de consulter la Bibliothèque de persistance de la pièce pour Android. Il est beaucoup plus facile de mettre en place une base de données et d’exécuter une grande partie du code standard pour vous.


3 commentaires

Désolé, je ne suis pas sûr d'avoir été tout à fait clair dans ma question - je vais revenir en arrière et la modifier. J'essaie de charger les noms des scouts à partir d'une base de données pour que le chef puisse les inviter à des événements. Ce que vous avez mis là-bas devrait cependant être utile pour une autre partie du programme - merci!


@SamOg ah je vois ce que tu veux dire maintenant. Les autres réponses ici devraient résoudre votre problème :)


Merci pour votre aide quand même!



2
votes

Votre whereClause = COLUMN_SECTION + "=?"; a un seul argument. Mais vous passez 6 arguments de sélection dans whereArgs = new String [] {"Beavers", "Cubs", "Scouts", "Explorers", "Network", "Leaders"}; .

C'est précisément ce que suggère l'erreur. Il attend un seul whereArgument.


3 commentaires

Génial, merci pour ça! Ces sélections sont en fait toutes les sections du scoutisme - pourriez-vous me conseiller sur la manière correcte de sélectionner tous les scouts de toutes les différentes sections à utiliser dans un spinner, à l'aide d'un curseur? Merci!


Il vous suffit de changer votre clause where pour qu'elle ressemble à ceci - whereClause = COLUMN_SECTION + "IN" + ('Beavers', 'Cubs', 'Scouts', 'Explorers', 'Network', 'Leaders') < / code> Pour faire cela, nous pouvons avoir - "whereClause = COLUMN_SECTION +" IN "+" (?,?,?,?,?,?) " et garder les whereArgs identiques.


C'est correct aussi désolé, je ne peux pas marquer les deux comme corrects. Je l'ai cependant voté. Merci de l'avoir signalé!



2
votes

Vous devriez consulter cette réponse . Votre sélection (clause where) doit contenir exactement autant de ? que d'arguments sont donnés dans vos arguments de sélection. Dans ce cas, votre sélection ne contient qu'un seul ? mais vous donnez 6 arguments de sélection.

La sélection que vous souhaitez probablement est:

COLUMN_SECTION + "IN (?, ?, ?, ?, ?, ?)"

En passant votre list of section comme selectionArgs devrait fonctionner alors.

Pensez à consulter ce tutoriel pour en savoir plus en savoir plus sur l'enregistrement des données avec SQLite.


4 commentaires

Cela a complètement résolu le problème de la base de données - malheureusement, il s'avère qu'il y a toujours un problème avec le spinner. Merci pour toute votre aide sur le SQL, cela a fonctionné parfaitement après cela!


Comment implémentez-vous le Spinner? Qu'avez-vous essayé? Veuillez mettre à jour votre question afin que nous ayons plus d'informations.


J'ai résolu le problème - désolé, j'ai pensé qu'il valait mieux ne pas le mettre ici car je pensais que c'était complètement différent de la question que j'avais initialement posée. Merci pour votre aide avec la base de données, cependant.


Très bien, c'est bon d'entendre que vous pourriez vous débrouiller seul. Heureux de vous aider.