如何从Sqlite获取最后记录?


93

我有一张桌子question_table和一张ImageButtonBack)。单击Back后,我需要从数据库中获取最后插入的记录。

我行包括下面的列:questionoptionAoptionBoptionCoptionD,,我需要在我使用的数据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;
}

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

请给我一些提示。

Answers:


186

试试这个:

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

要么

您还可以使用以下解决方案:

SELECT * FROM tablename ORDER BY column DESC LIMIT 1;

25
为此,这是非常糟糕的请求,因为sqlite应在返回结果之前按其ID(慢速)对所有记录进行排序,斯蒂芬·阮(Stephen Nguyen)提出了DESCLIMIT 1
-Artem Zinnatullin13年

@Hasmukh嗨govind在这里..想在右下角做satelitemenu...。
Govind Rathod 2014年

@Govind这里是参考链接,它可能会对您有所帮助,github.com
siyamed/

@Hasmukh,如果假设列ID不仅是“ AUTOINCREMENT”,而是其他唯一的东西...仍在使用此解决方案?
Choletski '16

1
这个答案和其他答案似乎没有明确的假设,即他们正在排序的列始终在增加。自动增量列确实如此,但并非每个表都有这样的列。
LarsH '16

199

我认为最佳答案有点冗长,只需使用此

SELECT * FROM table ORDER BY column DESC LIMIT 1;

1
“最佳答案”并不总是始终是最佳答案。你是说哈斯穆克的吗?
LarsH '16

有时由于某些未知原因,它给出倒数第二个值...大多数情况下,它工作正常
MSD

23

从表中获取最新记录。

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

当您的SQLite数据库具有多个表时,您应该添加WHERE = TABLE_NAME语句
aphoe 2015年

@aphoe他不需要WHERE = TABLE_NAME,因为“ sqlite_sequence”是表引用。
apkisbossin

我无法保证未排序查询中的最后一条记录将是表的最后一条记录。我敢打赌这“经常”起作用。但是您不能依靠它。
Anders8

11

这是一个简单的示例,仅返回最后一行,而无需对任何列进行任何排序:

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


8

如果您已经有了游标,那么这就是从游标中获取最后一条记录的方法:

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

有没有一种方法可以通过在getContentResolver()。query上创建游标来实现?
ralphgabb15年

您可以简单地使用cursor.moveToLast();
Anant Shah,


2

我想维护我的表,同时拉入一排,该表为我提供了表中特定列的最后一个值。我本质上是在寻找替换LAST()excel中的功能的方法,并且此方法可行。

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

1

假设您正在将表dbstr.TABNAME的最后一行查找到名为“ _ID”的INTEGER列中(例如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;
}

0

在sqlite中,有一个名为sqlite_sequence的表,该表包含表名及其最后的ID号(如果ID是自动递增的)。

因此,要获得表中的最后一行,只需输入:

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#

0

另一种选择是LAST_VALUE()通过以下方式使用SQLite 函数。

给定此表:

+--------+---------+-------+
| 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          |
+--------+--------------+
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.