如何从Sqlite获取最新记录?

79 sqlite android

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

我行包括下面的列: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;
}
Run Code Online (Sandbox Code Playgroud)

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();
        }           
    }
});
Run Code Online (Sandbox Code Playgroud)

请给我一些提示.

Ste*_*yen 180

我认为最好的答案有点冗长,只需使用它

SELECT * FROM table ORDER BY column DESC LIMIT 1;
Run Code Online (Sandbox Code Playgroud)


Has*_*ukh 166

试试这个:

SELECT * 
    FROM    TABLE
    WHERE   ID = (SELECT MAX(ID)  FROM TABLE);
Run Code Online (Sandbox Code Playgroud)

要么

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

SELECT*FROM tablename ORDER BY列DESC LIMIT 1;

  • 这是非常糟糕的请求,因为`sqlite`应该在返回结果之前按其id(慢)排序所有记录,Stephen Nguyen用`DESC`和`LIMIT 1'给出了最佳请求. (24认同)
  • 这个和其他答案似乎有一个未明确的假设,即他们排序的列总是在增加。自动增量列确实如此,但并非每个表都有这样的列。 (2认同)

5hs*_*sba 22

要从你的表中获取最后一条记录..

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


Leo*_*ela 8

我认为如果你使用SQLiteDatabase类中的方法查询,而不是整个SQL字符串,那将会更好,这将是:

 Cursor cursor = sqLiteDatabase.query(TABLE, allColluns, null, null, null, null, ID +" DESC", "1");
Run Code Online (Sandbox Code Playgroud)

最后两个参数是ORDER BY和LIMIT.

您可以在以下网址查看更多信息:http: //developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html


Saa*_*kke 7

LAST_VALUE()另一种选择是按以下方式使用 SQLites函数。

鉴于此表:

目的 地位 时间
1 100
1 离开 102
1 103
2 101
2 离开 102
2 103
3 离开 102
3 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
Run Code Online (Sandbox Code Playgroud)

结果如下:

目的 最后状态
1
2
3

您可以选择其他列来显示最后一个值,只需使用单独的窗口函数添加它即可:

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,
    LAST_VALUE(TIME) OVER (
        PARTITION BY OBJECT
        ORDER by time asc
        RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
    ) as lastTime
FROM 
    TABLE
Run Code Online (Sandbox Code Playgroud)
目的 最后状态 上次
1 103
2 103
3 103

或者通过进行某种串联:

SELECT                           
    DISTINCT OBJECT,             -- Only unique rows
    LAST_VALUE(STATUS || ':' || TIME) 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 lastStatusTime
FROM 
    TABLE
Run Code Online (Sandbox Code Playgroud)
目的 最后状态时间
1 上:103
2 上:103
3 上:103


waq*_*lam 6

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

cursor.moveToPosition(cursor.getCount() - 1);
//then use cursor to read values
Run Code Online (Sandbox Code Playgroud)


小智 6

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

"SELECT * FROM TableName ORDER BY rowid DESC LIMIT 1;"       
Run Code Online (Sandbox Code Playgroud)

  • 很不错。对所引用的行不做任何假设,并且排序可能也更快。 (2认同)