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.

9voto

waqaslam Points 31012

Si vous avez déjà obtenu le curseur, voici comment vous pouvez obtenir le dernier enregistrement du curseur :

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

0 votes

Y a-t-il un moyen d'obtenir cela par la création d'un curseur sur getContentResolver().query ?

0 votes

Vous pouvez simplement utiliser cursor.moveToLast() ;

4voto

Une autre option consiste à utiliser SQLites LAST_VALUE() de la manière suivante.

Étant donné ce tableau :

+--------+---------+-------+
| OBJECT |  STATUS |  TIME |
+--------+---------+-------+
|        |         |       |
| 1      |  ON     |  100  |
|        |         |       |
| 1      |  OFF    |  102  |
|        |         |       |
| 1      |  ON     |  103  |
|        |         |       |
| 2      |  ON     |  101  |
|        |         |       |
| 2      |  OFF    |  102  |
|        |         |       |
| 2      |  ON     |  103  |
|        |         |       |
| 3      |  OFF    |  102  |
|        |         |       |
| 3      |  ON     |  103  |
+--------+---------+-------+

Vous pouvez obtenir le dernier statut de chaque objet avec la requête suivante

SELECT                           
    DISTINCT OBJECT,             -- Only unique rows
    LAST_VALUE(STATUS) OVER (    -- The last value of the status column
        PARTITION BY OBJECT      -- Taking into account rows with the same value in the object column
        ORDER by time asc        -- "Last" when sorting the rows of every object by the time column in ascending order
        RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING    -- Take all rows in the patition
    ) as lastStatus
FROM
    TABLE

Le résultat serait le suivant :

+--------+--------------+
| OBJECT |  LAST_STATUS |
+--------+--------------+
|        |              |
| 1      |  ON          |
|        |              |
| 2      |  ON          |
|        |              |
| 3      |  ON          |
+--------+--------------+

0 votes

C'est utile, je n'avais jamais entendu parler de LAST_VALUE().

3voto

Zanna Points 261

Supposons que vous recherchez la dernière ligne de la table dbstr.TABNAME, dans une colonne INTEGRALE nommée "_ID" (par exemple BaseColumns._ID), mais cela pourrait être n'importe quelle autre colonne.

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

2voto

Dilavar Points 281

C'est simple, vous pouvez vous déplacer avec Cursor moveToLast() ; permet de passer au dernier enregistrement

cursor.moveToLast();

2voto

j casillas Points 21

Je voulais maintenir mon tableau tout en extrayant une ligne qui me donne la dernière valeur dans une colonne particulière du tableau. Je cherchais essentiellement à remplacer le LAST() dans Excel et cela a fonctionné.

, (Select column_name FROM report WHERE rowid = (select last_insert_rowid() from report))

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