Bagaimana cara mendapatkan catatan terakhir dari Sqlite?


96

Saya memiliki satu meja question_tabledan satu ImageButton( Belakang ). Saya perlu mendapatkan catatan yang disisipkan terakhir dari database setelah mengklik tombol Kembali .

Baris saya berisi kolom berikut: question, optionA, optionB, optionC, optionD, dan saya membutuhkan data untuk digunakan pada saya Activity. Saya membuat satu metode dalam database tetapi tidak berfungsi.

Ini kode untuk referensi:

Ekstrak MySQLiteHelper.java :

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

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

Tolong beri saya beberapa petunjuk.

Jawaban:


188

Coba ini:

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

ATAU

Anda juga dapat menggunakan solusi berikut:

SELECT * FROM tablename ORDER BY column DESC LIMIT 1;

25
Ini adalah permintaan yang sangat buruk untuk tujuan itu karena sqliteharus mengurutkan semua catatan berdasarkan id mereka (lambat) sebelum mengembalikan hasilnya, Stephen Nguyen memberikan permintaan yang optimal dengan DESCdanLIMIT 1
— Artem Zinnatullin

@Hasmukh hi govind di sini .. ingin melakukan satelitemenu di pojok kanan bawah ... apakah Anda berhasil ..?
— Govind Rathod

@Govind ini adalah tautan referensi, ini dapat membantu Anda, github.com/siyamed/android-satellite-menu/issues/3
— Hasmukh

@ Hasmukh, jika misalkan kolom id bukan hanya 'AUTOINCREMENT' tetapi sesuatu yang unik ... masih berfungsi solusi ini?
— Choletski

1
Jawaban ini dan lainnya tampaknya memiliki asumsi tidak tertulis bahwa kolom yang mereka sortir selalu bertambah. Itu benar untuk kolom autoincrement, tetapi tidak setiap tabel memiliki kolom seperti itu.
— LarsH

207

Saya pikir jawaban teratas agak bertele-tele, gunakan saja ini

SELECT * FROM table ORDER BY column DESC LIMIT 1;

1
"Jawaban teratas" tidak selalu menjadi jawaban teratas. Apakah yang Anda maksud Hasmukh?
— LarsH

terkadang memberikan nilai kedua terakhir untuk beberapa alasan yang tidak diketahui ... sebagian besar waktu berfungsi dengan baik
— MSD

Jika kolom bertanda AUTOINCREMENT maka SELECT MAX (ID) lebih baik. Menggunakan CLI, jalankan 'EXPLAIN QUERY PLAN <query>' hasil kueri Anda dalam pemindaian tabel penuh, sedangkan SELECT MAX (ID) menghasilkan penelusuran yang jauh lebih cepat.
— Brian Heilig

23

Untuk mendapatkan catatan terakhir dari tabel Anda ..

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

Anda harus menambahkan pernyataan WHERE = TABLE_NAME ketika SQLite db Anda memiliki lebih dari satu tabel
— aphoe

@aphoe Dia tidak membutuhkan WHERE = TABLE_NAME karena "sqlite_sequence" adalah referensi tabel.
— apkisbossin

Saya tahu tidak ada jaminan bahwa catatan terakhir dalam kueri yang tidak diurutkan akan menjadi catatan terakhir dari tabel. Saya yakin ini berhasil "sering". Anda tidak bisa mengandalkannya.
— Anders8

13

Berikut adalah contoh sederhana yang hanya mengembalikan baris terakhir tanpa perlu mengurutkan apa pun dari kolom mana pun:

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


8

Jika Anda sudah mendapatkan kursor, inilah cara Anda mendapatkan rekaman terakhir dari kursor:

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

adakah cara untuk mendapatkannya melalui pembuatan kursor di getContentResolver (). query?
— ralphgabb

Anda cukup menggunakan cursor.moveToLast ();
— Anant Shah

2

Misalkan Anda mencari baris terakhir dari tabel dbstr.TABNAME, ke dalam kolom INTEGER bernama "_ID" (misalnya BaseColumns._ID), tetapi dapat berupa kolom lain yang Anda inginkan.

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

2

Sederhana saja, Anda bisa bergerak dengan Cursor moveToLast (); metode menyediakan untuk pindah ke catatan terakhir

cursor.moveToLast();

2

Saya ingin mempertahankan tabel saya sambil menarik satu baris yang memberi saya nilai terakhir di kolom tertentu dalam tabel. Saya pada dasarnya ingin mengganti LAST()fungsi di excel dan ini berhasil.

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

1

Pilihan lainnya adalah menggunakan LAST_VALUE()fungsi SQLites dengan cara berikut.

Diberikan tabel ini:

+--------+---------+-------+
| 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  |
+--------+---------+-------+

Anda bisa mendapatkan status terakhir dari setiap objek dengan kueri berikut

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

Hasilnya akan terlihat seperti ini:

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

0

di sqlite, ada tabel bernama sqlite_sequence, tabel ini berisi nama tabel dan nomor id terakhirnya (jika id bertambah otomatis).

Jadi, untuk mendapatkan baris terakhir dalam sebuah tabel, letakkan saja:

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

0

Jawaban sebelumnya mengasumsikan bahwa ada kolom ID integer yang bertambah , sehingga MAX(ID)memberikan baris terakhir. Tetapi terkadang tombol-tombol tersebut berjenis teks , tidak diurutkan dengan cara yang dapat diprediksi. Jadi untuk mengambil 1 atau N baris terakhir (# Nrows #) kita dapat mengikuti pendekatan yang berbeda :

Select * From [#TableName#]  LIMIT #Nrows# offset cast((SELECT count(*)  FROM [#TableName#]) AS INT)- #Nrows#
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.