127 votes

Comment obtenir le dernier enregistrement de Sqlite ?

J'ai une table unique question_table et un ImageButton ( Dos ). J'ai besoin de récupérer le dernier enregistrement inséré dans la base de données après avoir cliqué sur l'icône Dos .

Ma ligne contient les colonnes suivantes : question , optionA , optionB , optionC , optionD et j'ai besoin de ces données pour les utiliser dans mon Activity . J'ai créé une méthode dans la base de données mais elle ne fonctionne pas.

Voici le code pour référence :

MySQLiteHelper.java extrait :

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

Veuillez me donner un indice.

247voto

Stephen Nguyen Points 896

Je pense que la réponse du haut est un peu verbeuse, utilisez simplement ceci

SELECT * FROM table ORDER BY column DESC LIMIT 1;

1 votes

La "meilleure réponse" ne reste pas toujours la meilleure réponse. Voulez-vous dire celle de Hasmukh ?

0 votes

Parfois, il donne l'avant-dernière valeur pour une raison inconnue... la plupart du temps, il fonctionne bien.

0 votes

Si la colonne est marquée AUTOINCREMENT, SELECT MAX(ID) est préférable. En utilisant l'exécution CLI 'EXPLAIN QUERY PLAN <query>', votre requête résulte en un balayage complet de la table, alors que SELECT MAX(ID) résulte en une recherche beaucoup plus rapide.

215voto

Hasmukh Points 4396

Essayez ça :

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

OU

vous pouvez également utiliser la solution suivante :

SELECT * FROM tablename ORDER BY column DESC LIMIT 1;

30 votes

C'est une très mauvaise demande à cet effet, car sqlite devrait trier tous les enregistrements par leur id (lent) avant de retourner le résultat, Stephen Nguyen a donné une requête optimale avec DESC y LIMIT 1

1 votes

@Hasmukh hi govind here... want to do satelitemenu at the right of bottom corner... did you done it... ?

0 votes

@Govind voici le lien de référence, il peut vous aider, github.com/siyamed/Android-satellite-menu/issues/3

25voto

raju Points 5451

Pour obtenir le dernier enregistrement de votre table

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

1 votes

Vous devez ajouter l'instruction WHERE = TABLE_NAME lorsque votre base de données SQLite comporte plus d'une table.

0 votes

@aphoe Il n'a pas besoin de WHERE = TABLE_NAME car "sqlite_sequence" est la référence de la table.

0 votes

Je ne connais aucune garantie que le dernier enregistrement d'une requête non triée sera le dernier enregistrement de la table. Je parie que cela fonctionne "souvent". Mais vous ne pouvez pas vous y fier.

24voto

user4061742 Points 157

Voici un exemple simple qui renvoie simplement la dernière ligne sans avoir besoin de trier quoi que ce soit dans une colonne :

"SELECT * FROM TableName ORDER BY rowid DESC LIMIT 1;"

0 votes

Très bien. Il ne fait aucune supposition sur la ligne référencée et est probablement plus rapide à trier.

12voto

LeonardoSibela Points 424

Je pense que ce serait mieux si vous utilisiez la méthode query de la classe SQLiteDatabase au lieu de la chaîne SQL entière, qui serait :

 Cursor cursor = sqLiteDatabase.query(TABLE, allColluns, null, null, null, null, ID +" DESC", "1");

Les deux derniers paramètres sont ORDER BY et LIMIT.

Vous pouvez en voir plus sur le site : http://developer.Android.com/reference/Android/database/sqlite/SQLiteDatabase.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X