Ошибка с курсором при загрузке деталей из базы данных - PullRequest
0 голосов
/ 24 января 2019

В настоящее время я работаю над школьным проектом, пытаясь создать менеджера Скаутской группы. Я впервые использую Java, XML или Android Studio, поэтому прогресс был немного медленным, но я добираюсь до конца. Проблема, с которой я столкнулся на данный момент, заключается в извлечении деталей разведчика из базы данных, чтобы их можно было поместить в счетчик. Затем лидер выберет скаутов, которых они хотят пригласить, по имени. Код, который, по-видимому, вызывает ошибку (в классе обработчика базы данных), приведен ниже:

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
}

И информация из logcat снова ниже:

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) 

Любая помощь будет оценена. Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Ваш whereClause = COLUMN_SECTION + "=?"; имеет единственный аргумент. Но вы передаете 6 аргументов выбора в whereArgs = new String[]{"Beavers","Cubs","Scouts","Explorers","Network","Leaders"};.

Это именно то, что предлагает ошибка. Ожидается сингл whereArgument.

0 голосов
/ 24 января 2019

Вы должны проверить этот ответ .Ваш выбор (предложение where) должен содержать ровно столько ?, сколько аргументов указано в ваших аргументах выбора.В этом случае ваш выбор содержит только один ?, но вы даете 6 аргументов выбора.

Выбор, который вы, вероятно, хотите:

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

Передача списка разделов, так как selectionArgs должен работатьзатем.

Попробуйте прочитать этого руководства , чтобы узнать больше о сохранении данных с помощью SQLite.

0 голосов
/ 24 января 2019

Должен ли список быть изменчивым? Если нет, вы можете просто указать строковый массив в вашем strings.xml файле в ваших ресурсах, например:

strings.xml

<?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>

Затем, где бы вы ни настраивали свой Spinner объект:

SomeActivity.java

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);

* См. здесь для использования ArrayAdapter

Теперь, если это НЕОБХОДИМО, чтобы это был изменяемый список, тогда я предлагаю изучить Room Persistence Library для Android. Гораздо проще подготовить и запустить БД, и он позаботится о большом количестве стандартного кода для вас.

...