Как получить последнюю запись из Sqlite?

96

У меня есть один стол 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();
        }           
    }
});

Пожалуйста, дайте мне подсказку.

ADM
источник

Ответы:

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 здесь ссылка ссылка, это может помочь вам, github.com/siyamed/android-satellite-menu/issues/3
Hasmukh
@Hasmukh, если предположить, что идентификатор столбца не просто «AUTOINCREMENT», а что-то еще уникальное ... это решение все еще работает?
Choletski
1
Этот и другие ответы, похоже, содержат неустановленное предположение о том, что столбец, по которому они сортируются, всегда увеличивается. Это верно для столбцов с автоинкрементом, но не в каждой таблице есть такой столбец.
LarsH 01
206

Я думаю, что главный ответ немного многословен, просто используйте это

SELECT * FROM table ORDER BY column DESC LIMIT 1;
Стивен Нгуен
источник
1
«Главный ответ» не всегда остается главным. Вы имеете в виду Хасмуха?
LarsH 01
иногда по какой-то неизвестной причине он выдает второе последнее значение ... в большинстве случаев он работает нормально
MSD
Если столбец отмечен AUTOINCREMENT, то лучше выбрать SELECT MAX (ID). Используя CLI, выполните 'EXPLAIN QUERY PLAN <query>', ваш запрос приведет к полному сканированию таблицы, тогда как SELECT MAX (ID) приведет к гораздо более быстрому поиску.
Брайан Хейлиг
23

Чтобы получить последнюю запись из вашей таблицы ..

 String selectQuery = "SELECT  * FROM " + "sqlite_sequence";
 Cursor cursor = db.rawQuery(selectQuery, null);
  cursor.moveToLast();
5хссба
источник
Вы должны добавить инструкцию WHERE = TABLE_NAME, если ваша база данных SQLite имеет более одной таблицы
aphoe
@aphoe Ему не нужно WHERE = TABLE_NAME, потому что "sqlite_sequence" - это ссылка на таблицу.
apkisbossin
Я не знаю гарантии, что последняя запись в несортированном запросе будет последней записью в таблице. Бьюсь об заклад, это работает "часто". Однако на это нельзя полагаться.
Anders8
13

Вот простой пример, который просто возвращает последнюю строку без необходимости сортировать что-либо из любого столбца:

"SELECT * FROM TableName ORDER BY rowid DESC LIMIT 1;"       
user4061742
источник
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 ();
Анант Шах
2

Предположим, вы ищете последнюю строку таблицы 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;
}
Занна
источник
2

Просто перемещаться можно с помощью Cursor moveToLast (); метод обеспечивает переход к последней записи

cursor.moveToLast();
Дилавар Малек
источник
2

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

, (Select column_name FROM report WHERE rowid = (select last_insert_rowid() from report))
Джей Касильяс
источник
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')
briniSoft
источник
0

В предыдущих ответах предполагается, что существует столбец с увеличивающимся целочисленным идентификатором, поэтому MAX(ID)отображается последняя строка. Но иногда клавиши бывают текстового типа , а не упорядочены предсказуемым образом. Итак, чтобы взять последние 1 или N строк (# Nrows #), мы можем использовать другой подход :

Select * From [#TableName#]  LIMIT #Nrows# offset cast((SELECT count(*)  FROM [#TableName#]) AS INT)- #Nrows#
Anefeletos
источник