Як отримати останній запис із Sqlite?


95

У мене є один стіл question_tableі один ImageButton( Назад ). Мені потрібно отримати останній вставлений запис із бази даних після натискання кнопки Назад .

Моя рядок містить такі стовпці: question, optionA, optionB, optionC, optionD, і мені потрібні дані для використання на моємуActivity . Я створюю один метод у базі даних, але він не працює.

Ось код для довідки:

Витяг 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;
}

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

Будь ласка, дайте мені підказку.

Відповіді:


188

Спробуйте це:

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

АБО

Ви також можете використовувати наступне рішення:

SELECT * FROM tablename ORDER BY column DESC LIMIT 1;

25
Це дуже поганий запит для цієї мети, тому що sqliteперед тим, як повернути результат, слід сортувати всі записи за їх ідентифікатором (повільно), Стівен Нгуєн дав оптимальний запит DESCтаLIMIT 1
Артему Зіннатулліну

@Hasmukh привіт govind тут .. хочу зробити супутникове меню в правому нижньому куті ... ти це зробив ..?
Govind Rathod

@Govind ось посилання, це може вам допомогти, github.com/siyamed/android-satellite-menu/issues/3
Хасмух

@Hasmukh, якщо припустимо, що ідентифікатор стовпця - це не просто "АВТОМОБІЛЯЦІЯ", а щось інше унікальне ... все ще працює з цим рішенням?
Холецький

1
Ця та інші відповіді, мабуть, мають невизначене припущення, що стовпець, за яким вони сортують, завжди збільшується. Це стосується стовпців автоінкременту, але не кожна таблиця має такий стовпець.
LarsH

200

Я думаю, що головна відповідь трохи багатослівна, просто використовуйте цю

SELECT * FROM table ORDER BY column DESC LIMIT 1;

1
"Топ відповіді" не завжди залишається найкращою відповіддю. Ви маєте на увазі Хасмуха?
LarsH

іноді це дає останнє значення з якихось невідомих причин ... більшу частину часу це працює нормально
MSD

Якщо стовпець позначений AUTOINCREMENT, тоді ВИБІР МАКС. (ID) краще. Використовуючи CLI, виконайте "ПОЯСНІТЬ ПЛАН ЗАПИТУ <запит>", ваш запит призводить до повного сканування таблиці, тоді як SELECT MAX (ID) призводить до набагато швидшого пошуку.
Брайан Хайліг,

23

Щоб отримати останній запис із вашої таблиці ..

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

Ви повинні додати оператор WHERE = TABLE_NAME, коли ваш SQLite db має більше однієї таблиці
aphoe

@aphoe Йому не потрібно WHERE = TABLE_NAME, оскільки "sqlite_sequence" є посиланням на таблицю.
apkisbossin

Я не знаю жодних гарантій того, що останній запис у несортованому запиті буде останнім записом таблиці. Б'юся об заклад, це працює "часто". Ти не можеш на це покластися.
Anders8,

11

Ось простий приклад, який просто повертає останній рядок без необхідності сортувати щось із будь-якого стовпця:

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

9

Я думаю, було б краще, якщо ви використовуєте запит методу з класу SQLiteDatabase замість цілого рядка SQL, який буде:

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

Останніми двома параметрами є ORDER BY та LIMIT.

Ви можете побачити більше на: http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html


8

Якщо ви вже отримали курсор, то ось як ви можете отримати останній запис із курсору:

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

це спосіб отримати це шляхом створення курсору на запиті getContentResolver ().
ralphgabb

Ви можете просто використовувати cursor.moveToLast ();
Anant Shah

2

Просто, ви можете рухатися за допомогою Cursor moveToLast (); метод забезпечує перехід до останнього запису

cursor.moveToLast();

2

Я хотів підтримувати свою таблицю, витягуючи один рядок, який дає мені останнє значення в певному стовпці таблиці. По суті, я прагнув замінити LAST()функцію в Excel, і це спрацювало.

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

1

Припустимо, ви шукаєте останній рядок таблиці dbstr.TABNAME у стовпці INTEGER з іменем "_ID" (наприклад, BaseColumns._ID), але можете бути будь-яким іншим стовпцем, який вам потрібно.

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

Інший варіант - використовувати LAST_VALUE()функцію SQLites наступним чином.

Враховуючи цю таблицю:

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

Ви можете отримати останній статус кожного об’єкта за допомогою наступного запиту

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

Результат буде виглядати так:

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

0

у sqlite існує таблиця з назвою sqlite_sequence, ця таблиця містить ім'я таблиці та її останній ідентифікаційний номер (якщо ідентифікатор автоматично збільшується).

Отже, щоб отримати останній рядок у таблиці, просто поставте:

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

0

У попередніх відповідях предположат , що існує збільшується ціле ID стовпець, так що MAX(ID)дає останній рядок. Але іноді клавіші мають текстовий тип , а не впорядковані передбачувано. Отже, щоб взяти останні 1 або N рядків (# Nrows #), ми можемо дотримуватися іншого підходу :

Select * From [#TableName#]  LIMIT #Nrows# offset cast((SELECT count(*)  FROM [#TableName#]) AS INT)- #Nrows#
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.