2012-03-28 41 views
50

Ich habe eine Tabelle question_table und eine ImageButton (Zurück). Ich muss den letzten eingefügten Datensatz aus der Datenbank abrufen, nachdem ich auf Zurück geklickt habe.Wie bekomme ich den letzten Datensatz von Sqlite?

Meine Zeile enthält die folgenden Spalten: question, optionA, optionB, optionC, optionD, und ich brauche die Daten für den Einsatz auf meinem Activity. Ich erstelle eine Methode in der Datenbank, aber es funktioniert nicht.

Hier Code als Referenz:

MySQLiteHelper.java Extrakt:

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 von 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(); 
     }   
    } 
}); 

Bitte geben Sie mir einen Hinweis.
Vielen Dank im Voraus ..

Antwort

124

Try this:

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

ODER

Sie können auch folgende Lösung verwendet:

SELECT * FROM Tabellenname ORDER BY Spalte DESC LIMIT 1;

+0

für mich auch nützlich. Vielen Dank. –

+0

Enjoy .... Hardik – Hasmukh

+18

Dies ist eine sehr schlechte Anfrage für diesen Zweck, weil 'sqlite' alle Datensätze nach ihrer ID (langsam) sortieren sollte, bevor das Ergebnis zurückgegeben wird, gab Stephen Nguyen optimale Anfrage mit' DESC' und 'LIMIT1' –

5

Wenn Sie bereits die Cursor bekamen, dann ist dies, wie Sie den letzten Datensatz von Cursor erhalten können:

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

ist eine Möglichkeit, dies durch die Erstellung des Cursors auf getContentResolver() zu bekommen. – ralphgabb

20

letzten Datensatz vom Tisch zu bekommen ..

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

Sie sollten die Anweisung WHERE = TABLE_NAME hinzufügen, wenn Ihre SQLite-Datenbank mehr als eine Tabelle hat – aphoe

+0

@aphoe Er benötigt WHERE = TABLE_NAME nicht, weil "sqlite_sequence" die Tabellenreferenz ist. – apkisbossin

+0

Ich kenne keine Garantie, dass der letzte Datensatz in einer unsortierten Abfrage der letzte Datensatz der Tabelle sein wird. Ich wette, das funktioniert "oft". Sie können sich jedoch nicht darauf verlassen. – Anders8

106

Ich denke, die beste Antwort ist ein bisschen ausführlich. gib einfach folgendes ein!

SELECT * FROM table ORDER BY column DESC LIMIT 1; 

glückliche tage.

+4

Das ist definitiv die richtige Antwort! – Jorge

+0

Die "Top-Antwort" bleibt nicht immer die beste Antwort. Meinst du Hasmukhs? – LarsH

1

Angenommen, Sie suchen letzte Zeile der Tabelle dbstr.TABNAME, in eine Integer-Spalte namens „_ID“ (zum Beispiel BaseColumns._ID), konnte aber anyother Spalte sein Sie wollen.

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

nur einfach können Sie mit Cursor moveToLast() bewegen; Methode bietet Um zum letzten Datensatz zu wechseln

cursor.moveToLast();

0

In SQLite gibt es eine Tabelle namens sqlite_sequence, diese Tabelle enthält den Tabellennamen und seine letzte ID-Nummer (wenn die ID automatisch inkrementiert wird).

So, die letzte Zeile in einer Tabelle erhalten gerade setzen:

Select * from TABLENAME where id=(SELECT * from sqlite_sequence where name ='TABLENAME') 
Verwandte Themen