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.

ADM
sumber

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;
Hasmukh
sumber
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;
Stephen Nguyen
sumber
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();
5hssba
sumber
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;"       
pengguna4061742
sumber
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
waqaslam
sumber
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;
}
Zanna
sumber
2

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

cursor.moveToLast();
Dilavar Malek
sumber
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))
j casillas
sumber
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          |
+--------+--------------+
Saaru Lindestøkke
sumber
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')
briniSoft
sumber
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#
anefeletos.dll
sumber