2012-03-28 120 views
50

Tengo una tabla question_table y una ImageButton (Atrás). Necesito obtener el último registro insertado de la base de datos después de hacer clic en Atrás.¿Cómo obtener el último registro de Sqlite?

Mi fila contiene las siguientes columnas: question, optionA, optionB, optionC, optionD, y necesito los datos para su uso en mi Activity. Creo un método en la base de datos pero no funciona.

Aquí es el código de referencia:

MySQLiteHelper.java extracto:

public List<ObjectiveWiseQuestion> getLastInsertQuestion() 
{ 
    // long index = 0; 
    List<ObjectiveWiseQuestion>LocwiseProfileList=new ArrayList<ObjectiveWiseQuestion>(); 
    db = getReadableDatabase(); 
    Cursor cursor = db.query(
      "sqlite_sequence", 
      new String[]{"seq"}, 
      "name = ?", 
      new String[]{TABLE_QUESTION}, 
      null, 
      null, 
      null, 
      null); 

    if (cursor.moveToFirst()) 
    { 
     do { 
      ObjectiveWiseQuestion owq= new ObjectiveWiseQuestion(); 

      owq.setQuestion(cursor.getString(2)); 
      owq.setOptionA(cursor.getString(3)); 
      owq.setOptionB(cursor.getString(4)); 
      owq.setOptionC(cursor.getString(5)); 
      owq.setOptionD(cursor.getString(6)); 
      owq.setCorrectOption(cursor.getString(7)); 
      LocwiseProfileList.add(owq); 
     } while(cursor.moveToNext()); 

     db.close(); 
    } 

    return LocwiseProfileList; 
} 

OnClickListner de AddQuestionActivity.java

imgBack.setOnClickListener(new View.OnClickListener() 
{      
    @Override 
    public void onClick(View v) 
    { 
     msg(); 
     emptyFormField(); 

     try { 
      final List<ObjectiveWiseQuestion> LocWiseProfile = db.getLastInsertQuestion();  

      for (final ObjectiveWiseQuestion cn : LocWiseProfile) 
      { 
       db=new MySQLiteHelper(getBaseContext()); 
       db.getWritableDatabase(); 
       txtQuestion.setText(cn.getQuestion()); 
       txtOptionA.setText(cn.getOptionA()); 
       txtOptionB.setText(cn.getOptionB()); 
       txtOptionC.setText(cn.getOptionC()); 
       txtOptionD.setText(cn.getOptionD()); 
       txtCorrectOption.setText(cn.getCorrectOption()); 
       db.close(); 
      } 
     } catch(Exception e) { 
      e.printStackTrace(); 
     }   
    } 
}); 

Por favor, dame alguna pista.
Gracias de antemano ..

Respuesta

124

Prueba esto:

SELECT * 
    FROM TABLE 
    WHERE ID = (SELECT MAX(ID) FROM TABLE); 

O

también puede utilizarse siguiendo solución:

SELECT * FROM nombretabla ORDEN POR columna DESC LIMIT 1;

+0

también útil para mí. Gracias. –

+0

Disfrutar .... Hardik – Hasmukh

+18

Esta es una muy mala solicitud para ese fin porque 'sqlite' debe ordenar todos los registros por su id (lento) antes de devolver el resultado, Stephen Nguyen dio una solicitud óptima con' DESC' y 'LIMIT 1' –

5

Si ya ha conseguido el cursor, entonces esta es la forma en que puede obtener el último registro desde el cursor:

cursor.moveToPosition(cursor.getCount() - 1); 
//then use cursor to read values 
+0

hay una manera de obtener esto mediante la creación del cursor en getContentResolver(). Query? – ralphgabb

20

Para acceder al último registro de la tabla ..

String selectQuery = "SELECT * FROM " + "sqlite_sequence"; 
Cursor cursor = db.rawQuery(selectQuery, null); 
    cursor.moveToLast(); 
+0

Debería agregar la declaración WHERE = TABLE_NAME cuando su base de datos SQLite tenga más de una tabla – aphoe

+0

@aphoe No necesita WHERE = TABLE_NAME porque "sqlite_sequence" es la referencia de la tabla. – apkisbossin

+0

No sé de ninguna garantía de que el último registro en una consulta sin clasificar será el último registro de la tabla. Apuesto a que esto funciona "a menudo". Sin embargo, no puedes confiar en eso. – Anders8

106

Creo que la respuesta principal es un poco detallada. ¡solo escribe lo siguiente!

SELECT * FROM table ORDER BY column DESC LIMIT 1; 

happy days.

+4

¡Definitivamente esta es la respuesta correcta! – Jorge

+0

La "respuesta máxima" no siempre sigue siendo la respuesta principal. ¿Te refieres a Hasmukh? – LarsH

1

Supongamos que busca la última fila de la tabla dbstr.TABNAME, en una columna entera llamada "_ID" (por ejemplo BaseColumns._ID), pero podría ser toda otra columna usted quiere.

public int getLastId() { 
    int _id = 0; 
    SQLiteDatabase db = dbHelper.getReadableDatabase(); 
    Cursor cursor = db.query(dbstr.TABNAME, new String[] {BaseColumns._ID}, null, null, null, null, null); 

    if (cursor.moveToLast()) { 
     _id = cursor.getInt(0); 
    } 

    cursor.close(); 
    db.close(); 
    return _id; 
} 
1

sólo simple se puede mover con el cursor moveToLast(); método proporciona Para ir al último registro

cursor.moveToLast();

0

en sqlite, hay una tabla llamada sqlite_sequence, esta tabla contiene el nombre de la tabla y su último número de identificación (si el ID se incrementa automáticamente).

Por lo tanto, para conseguir la última fila de una tabla sólo hay que poner:

Select * from TABLENAME where id=(SELECT * from sqlite_sequence where name ='TABLENAME') 
Cuestiones relacionadas