Як отримати останній запис із 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.