Eu tenho um database e estou fazendo uma consulta para ele usando
Cursor mCursor = mapDb.query(MY_TABLE, new String[] {KEY_ONEID, KEY_TWOID}, "trim("+KEY_TWOID + ") != '' ", null, null, null, null);
que em termos SQL significa literalmente: SELECT OneId, TwoId FROM auth WHERE trim(TwoId) != ''
Usando a consulta SQL bruta, isso funciona no meu navegador SQLite para mostrar as linhas em questão, portanto o object Cursor deve conter os mesmos resultados.
Em segundo lugar no meu método java estou usando uma condição para verificar se este resultado tem alguma coisa
if(mCursor.getColumnIndex(KEY_ONEID) > -1) //if > -1 then the mCursor returned a row { if(mCursor.getString(mCursor.getColumnIndex(KEY_ONEID)).contains(id)) //breaks here return mCursor.getString(mCursor.getColumnIndex(KEY_TWOID)); else return ""; }
Mas por alguma razão, mesmo que o hash do mCursor deva ter todos os valores retornados, esta próxima declaração condicional
mCursor.getString(mCursor.getColumnIndex(KEY_ONEID)).contains(id)
ainda retorna: An exception occurred: android.database.CursorIndexOutOfBoundsException
esta é a linha que lança a exceção: mCursor.getString(mCursor.getColumnIndex(KEY_ONEID))
e assim faz o meu próximo item na declaração de retorno
Estou confuso sobre como recuperar um determinado valor de linha, então! porque eu puxei o database e executei a mesma consulta e posso ver claramente que ambos os valores que eu quero, existem de fato!
a function Cursor não fornece muitas outras maneiras de recuperar valores, então a percepção foi apreciada!
Você precisa posicionar o Cursor na primeira linha antes de obter dados dele. Para fazer isso, você pode chamar: mCursor.moveToFirst()
. Além disso, essa chamada de método retorna um booleano, que será falso se não houver resultados; então você também pode usá-lo para se proteger contra esse caso.
Se você precisar iterar através de múltiplos resultados, depois de chamar mCursor.moveToFirst()
, você pode usar o método mCursor.moveToNext()
através das linhas de resultado uma por uma. Mais uma vez, isso retorna false quando chega ao final do dataset.
Espero que isso faça sentido.
Você pode iterar o cursor assim …
Cursor c=dbhelper.getQueById(i); if(c.getCount()>0) { for(c.moveToFirst();!c.isAfterLast();c.moveToNext()) { txt1.setText(c.getString(0)); txt2.setText(c.getString(1)); txt3.setText(c.getString(2)); } } else { Log.d(" Null value in cursor ", " null "); } c.close(); dbhelper.close();
Tente chamar mCursor.moveToFirst()
antes de tentar e chamar mCursor.getString
.
você só precisa chamar o cursor.moveToNext () para ir para o próximo começo desde o começo, então não precisamos chamar moveToFirst. moveToFirst é na verdade chamado no meio de algo.
while (cursor.moveToNext()) { //whatever you want to do }