【问题标题】:How to solve CursorIndexOutOfBoundsException with setMultiChoiceItems - Android如何使用 setMultiChoiceItems 解决 CursorIndexOutOfBoundsException - Android
【发布时间】:2017-12-28 23:22:54
【问题描述】:

我想要一个包含多项选择项(我的数据库中的项目)的 alertDialog,但是当我使用它时,出现以下错误:“android.database.CursorIndexOutOfBoundsException: Index 2 requested, with a size of 2”。

我从数据库中获取数据的代码:

public Cursor getAllData() {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.rawQuery("select * from "+TABLE_NAME_2,null);
    return res;
}

我的数据库:

public static final String TABLE_NAME_2 = "word_table";
public static final String COL1_1 = "ID";
public static final String COL1_2 = "NAME";
public static final String COL1_3 = "VALUE";
public static final String COL1_4 = "ISSELECTED";

db.execSQL("create table " + TABLE_NAME_2 +" (ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME TEXT,VALUE TEXT,ISSELECTED INTEGER)");

我的代码使用 multichoiceit

Cursor res = db.getAllData();
 AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMultiChoiceItems(res,res.getString(3),res.getString(1),new DialogInterface.OnMultiChoiceClickListener() {

        @Override
        public void onClick(DialogInterface parent, int position,
                            boolean checked) {

        }

    });
    builder.setCancelable(true);
    builder.setTitle(title);
    builder.show();

错误信息(我的数据库中只有 2 条记录):

android.database.CursorIndexOutOfBoundsException: Index 2 requested, with a size of 2

非常感谢您的帮助!

【问题讨论】:

  • 请告诉res.getString(3)res.getString(1)的值。
  • 添加您的 TABLE_NAME_2 结构,您似乎只有两列,但您在第三列建立了索引。
  • 完成,查看“我的数据库”。
  • 检查光标是否为空并使用 cursor.moveToFirst() 获取起始索引。
  • 看看这个Question & 大概看看这个answer also

标签: android


【解决方案1】:
if ( res.getCount() < 4 )
    return;

res.getString(3) // can safely be called now

但是我不理解你的代码,因为定义是

 public AlertDialog.Builder setMultiChoiceItems (Cursor cursor
   , String isCheckedColumn, String labelColumn
   , DialogInterface.OnMultiChoiceClickListener listener) 

我宁愿认为你会这样称呼它:

 builder.setMultiChoiceItems(res, "0", "1", .....         
 builder.setMultiChoiceItems(res, "ischecked", "label", .....

正如你现在发布的那样

public static final String COL1_3 = "VALUE";
public static final String COL1_4 = "ISSELECTED";

应该是:

builder.setMultiChoiceItems(res, COL1_4, COL1_3, .....

【讨论】:

  • 我把它放在哪里?
  • 使用前导致索引越界异常的语句或函数。
  • 光标:用于提供项目的光标。 isCheckedColumn :指定光标上的列名,用于确定复选框是否被选中。它必须返回一个整数值,其中 1 表示已检查,0 表示未检查。 labelColumn :光标上的列名,包含要在标签中显示的字符串。问题来自我的光标...但我不知道为什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 2015-08-22
  • 2017-08-10
  • 1970-01-01
  • 2018-02-17
  • 2017-05-28
相关资源
最近更新 更多