在Android代码中查询SQLite时出现CursorIndexOutOfBoundsException

时间:2013-05-15 06:43:18

标签: android sqlite android-sqlite

请注意,我正在尝试从我的Android应用程序中的SQLite DB中的表中检索值,在按钮单击事件上并通过ListView呈现它。我能够在同一事件的表中插入记录。虽然它会抛出以下错误:

`05-15 11:54:16.721: W/System.err(1834): android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1
05-15 11:54:16.721: W/System.err(1834):     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:434)
05-15 11:54:16.721: W/System.err(1834):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
05-15 11:54:16.721: W/System.err(1834):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
`

Follwing是我用于在ListView中从表中插入,检索和显示记录的代码块:

        save.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
              event=spinner.getSelectedItem().toString();
              message=ed1.getText().toString();
              MainActivity.myDataBase.openDatabase("/data/data/org.mithil.appname/databases/tablename", null,MainActivity.myDataBase.OPEN_READWRITE);
              MainActivity.myDataBase.execSQL("INSERT INTO " +
                      MainActivity.tablename +
                        " Values ('"+ finalnumber +"','"+ name +"','"+ message +"','"+ event +"','"+ ldate +"');");
              Cursor cu = MainActivity.myDataBase.rawQuery("SELECT Name FROM " + MainActivity.tablename + " WHERE Date =" + ldate +";" , null);
              cu.moveToFirst();
              Log.d("first rec", cu.toString());
              while(cu!=null)
              {
                  try{
                  lstitem.add(cu.getString(0));
                  cu.moveToNext();
                  }
                  catch(Exception e)
                  {
                      e.printStackTrace();
                  }
              }

所有这一切都发生在一个按钮点击。插入反映在表中,但'选择'不是。我认为移动光标有问题。表格包含五个字段,我只想检索一个即。 'Name'字段并将名称添加到ListView中。在我出错的地方纠正我。谢谢。

3 个答案:

答案 0 :(得分:2)

你应该像这样从光标中获取值

if(cu.moveToFirst())
{
do
{

}while(cu.moveToNext())
}

答案 1 :(得分:1)

while(cu !isAfterLast()){...

不应该超出界限。 它可以不为空并且仍然超出范围。

答案 2 :(得分:0)

尝试这只是获取光标计数并将其设置为for循环中的条件并迭代它。

 for(int i=0;i<cr.getCount;i++)
{
//do your stuff here;
cr.moveToNext();
}