Два курсора, ListView, CursorIndexOutOfBoundsException - PullRequest
0 голосов
/ 26 мая 2011

Как новичок в мире Android, я нуждаюсь в вашей помощи.У меня проблема с известным "CursorIndexOutOfBoundsException".

Я использую базу данных SQLite, и у меня есть два курсора, я получаю несколько строк из базы данных.Мне нужно получить некоторые предыдущие значения с некоторыми условиями с помощью второго курсора (c2) и поместить эти значения в ListView.

Код работает с одним исключением: "android.database.CursorIndexOutOfBoundsException: индекс 0 запрошен, с размером0 ".

ListView выглядит нормально, если я просто игнорирую это исключение, но хочу его исправить.

Я знаю, что это связано с курсором.Я пытался проверить некоторые условия - это не помогло.Может быть, если вы посмотрите на мой код, вы найдете причину.

Код:

public void LoadLogGrid()
{
    dbHelper=new DatabaseHelper(this);
    try
    {

    int LogName = (int) spinLog.getSelectedItemId();
    Cursor c=dbHelper.getLogByLogID(LogName);
    if (c != null) c.moveToFirst();
    int count = c.getCount();


    if (c.moveToFirst()){
        ArrayList<String> mArrayList = new ArrayList<String>();

    int i=0;
    do {

        int sVar1 = c.getInt(c.getColumnIndex("Var1")); 
        Long sId = (long) c.getInt(c.getColumnIndex("_id"));            

        Cursor c2=dbHelper.getPrevLogByLogID(LogName,sVar1);    
        c2.moveToFirst();

        if (c2!=null) {
            String sPrevOdo = c2.getString(c2.getColumnIndex("Odo"));
                mArrayList.add(sPrevOdo);
               c2.close();
        } else {
              //stopManagingCursor(c2); 
              //c2.close();
            Log.d("A:", "Something");
        }


        String [] from=new String []{"Date","Col1","Col2","Col3"};
        int [] to=new int [] {R.id.logDate,R.id.logCol1,R.id.logCol2,R.id.logCol3,R.id.rowOpt2};
        SimpleCursorAdapter sca=new LogCursorAdapter(this,R.layout.loggridrow,c,from,to,mArrayList);
        grid.setAdapter(sca);   
        registerForContextMenu(grid);
        i++;    

    } while (c.moveToNext());

        c.close();

    dbHelper.close();
    }   

    }
    catch(Exception ex)
    {
        AlertDialog.Builder b=new AlertDialog.Builder(this);
        b.setMessage(ex.toString());
        b.show();
    }

}

Запрос во втором курсоре:

public Cursor getPrevLogByLogID(long LogID, long Var1)
     {
         SQLiteDatabase db=this.getReadableDatabase();
        String[] params=new String[]{String.valueOf(LogID),String.valueOf(Var1)};

         Cursor c2=db.rawQuery("SELECT LogID as _id, Col1 from Log WHERE Col2=? AND Col3<? AND Full=1 ORDER BY Odo DESC", params);
         if (c2 != null) { c2.moveToFirst();}
         return c2;
     }  

Ответы [ 2 ]

0 голосов
/ 26 мая 2011

вы переместили c2 в позицию как c2.moveToFirst (), и после этого вы выполняете процесс проверки, независимо от того, равен он нулю или нет, и я думаю, что курсор должен быть нулевым, чтобы возникло исключение. состояние перед перемещением курсора в первую позицию

0 голосов
/ 26 мая 2011

Попробуйте изменить

do {
    ....
} while (c.moveToNext());

до

while (c.moveToNext()) {
    ....
}

Так, как сейчас, он будет запускать цикл хотя бы раз, несмотря ни на что.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...