提取数据时出现OutOfBoundsException

时间:2018-11-12 22:01:31

标签: java android database sqlite android-studio

Error

代码

        MainData myDBHlpr = new MainData(getActivity()); // Instantiate a MainDatabasehelper object called myDBHlpr

        Cursor csr = myDBHlpr.getAllQuestions(getActivity());

        mMostMessagesSent.setText(csr.getString(csr.getColumnIndex("MostMessagesSent")));
        Log.d("ZZZ", csr.getString(csr.getColumnIndex("MostMessagesSent")));


        csr.close();

仅用于获取SQLite数据的代码,但该行出现了超出范围的异常。 mMostMessagesSent.setText(csr.getString(csr.getColumnIndex("MostMessagesSent")));

空指针

enter image description here

数据库助手

public Cursor getAllQuestions(FragmentActivity usageSettings) {
    return this.getWritableDatabase().query(TABLE_NAME,null,null,null,null,null,null);
}

1 个答案:

答案 0 :(得分:0)

您没有移动到游标中的实际行。因此,当您尝试获取数据时,您位于第一行之前,因此位于 无法使用 的偏移量为 -1 strong>。

当SQLiteDatabase方法返回游标时,游标将位于第一行之前的位置。这个位置是-1。

  • 如果需要,可以使用csr.moveToPosition(-1)将光标设置为第一行之前。

假设您要遍历所有行,则以下内容将依次轮流移至每一行,直到没有更多行为止(如果可以进行此移动,通常Cursor moveTo ????方法将返回 true 否则返回 false )(这就是while循环适用于所有行的原因。)

    Cursor csr = myDBHlpr.getAllQuestions(getActivity());
    while (csr.moveToNext()) {
        mMostMessagesSent.setText(csr.getString(csr.getColumnIndex("MostMessagesSent")));
    }
    csr.close();

但是,那将仅在TextView中显示最后一行。如果这是一个问题,并且您无法解决该问题,则应该问另一个问题。

  • 请注意,如果Cursor没有行,则将不会执行任何操作,而TextView将保持原样,通常您希望表示未提取任何数据。 --
    • 例如,将其应用于您的代码,您可以在while循环之前使用mMostMessagesSent.setText("No Data Extracted"),因此TextView将指示如果未提取任何数据,则不会提取任何数据。