【问题标题】:Error With Cursor When Loading Details From Database从数据库加载详细信息时光标出错
【发布时间】:2019-06-18 15:17:58
【问题描述】:

我目前正在完成一个学校项目,试图创建一个 Scout Group 经理。这是我第一次使用 Java、XML 或 Android Studio,所以进展有点慢,但我已经做到了。我目前遇到的问题是从数据库中提取 Scout 详细信息,以便将它们放置在微调器中。然后,领导者将从微调器中按名称选择他们想要邀请的童子军。显然导致错误的代码(在数据库处理程序类中)如下:

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) 

任何帮助将不胜感激。提前致谢。

【问题讨论】:

    标签: java android sqlite android-studio android-sqlite


    【解决方案1】:

    您应该查看this answer。您的选择(where 子句)必须包含与您的选择参数中给出的参数一样多的?。在这种情况下,您的选择仅包含一个 ?,但您提供了 6 个选择参数。

    您可能想要的选择是:

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

    然后将您的部分列表作为 selectionArgs 应该可以工作。

    考虑查看this tutorial 以了解有关使用 SQLite 保存数据的更多信息。

    【讨论】:

    • 这完全解决了数据库问题 - 不幸的是,事实证明微调器仍然存在问题。感谢您对 SQL 的所有帮助,之后它工作得非常好!
    • 你是如何实现 Spinner 的?你试过什么?请更新您的问题,以便我们了解更多信息。
    • 我解决了这个问题 - 抱歉,我认为最好不要把它放在这里,因为我觉得它与我最初提出的问题完全不同。不过,感谢您对数据库方面的帮助。
    • 好的,很高兴听到您可以自己解决。很高兴能提供帮助。
    【解决方案2】:

    您的whereClause = COLUMN_SECTION + "=?"; 有一个参数。但是您在 whereArgs = new String[]{"Beavers","Cubs","Scouts","Explorers","Network","Leaders"}; 中传递了 6 个选择参数。

    这正是错误所暗示的。它需要单个 whereArgument。

    【讨论】:

    • 太棒了,谢谢!这些选择实际上是侦察中的所有部分 - 你能告诉我使用光标选择所有不同部分的所有侦察以用于微调器的正确方法吗?谢谢!
    • 您只需将 where 子句更改为如下所示 - whereClause = COLUMN_SECTION + " IN " + ('Beavers','Cubs','Scouts','Explorers','Network', 'Leaders') 要做到这一点,我们可以拥有 - "whereClause = COLUMN_SECTION + " IN " + " ( ? , ? , ? , ? , ? , ? ) " 并保持 whereArgs 不变。
    • 这也是正确的,抱歉,我无法将两者都标记为正确。虽然赞成。感谢您指出这一点!
    【解决方案3】:

    列表是否需要可变?如果没有,您可以在资源的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);
    

    *请参阅here 以了解如何使用ArrayAdapter

    现在,如果它确实需要是一个可变列表,那么我建议查看 Android 的 Room Persistence Library。启动和运行数据库要容易得多,并且会为您处理大量样板代码。

    【讨论】:

    • 抱歉,我不确定我的问题是否完全清楚 - 我会回去编辑它。我正在尝试从数据库中加载侦察员姓名,以便领导者能够邀请他们参加活动。不过,您在此处放置的内容应该对程序的另一部分有所帮助-谢谢!
    • @SamOg 啊,我明白你现在的意思了。那么这里的其他答案应该可以解决您的问题:)
    • 感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2017-10-25
    • 2011-04-14
    • 1970-01-01
    相关资源
    最近更新 更多