Android SQLite como obter uma coluna particular: valor da linha

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 }