如何从 Sqlite 获取最后一条记录?

Posted

技术标签:

【中文标题】如何从 Sqlite 获取最后一条记录?【英文标题】:How to get Last record from Sqlite? 【发布时间】:2012-04-11 17:50:17 【问题描述】:

我有一张桌子question_table 和一张ImageButton返回)。单击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;

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();
                   
    
);

请给我一些提示。

【问题讨论】:

【参考方案1】:

我觉得上面的回答有点冗长,就用这个

SELECT * FROM table ORDER BY column DESC LIMIT 1;

【讨论】:

“最佳答案”并不总是最佳答案。你是说 Hasmukh 的吗? 有时它会因为某些未知原因给出倒数第二个值...大多数时候它工作正常 如果列标记为 AUTOINCREMENT,则 SELECT MAX(ID) 更好。使用 CLI 执行 'EXPLAIN QUERY PLAN ' 您的查询会导致全表扫描,而 SELECT MAX(ID) 会导致更快的搜索。【参考方案2】:

试试这个:

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

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

SELECT * FROM tablename ORDER BY column DESC LIMIT 1;

【讨论】:

这是一个非常糟糕的请求,因为sqlite 应该在返回结果之前按它们的 id 对所有记录进行排序(慢),Stephen Nguyen 用DESCLIMIT 1 给出了最佳请求跨度> @Hasmukh hi govind here.. 想要在右下角做卫星菜单...你做到了吗.. ? @Govind 这里是参考链接,它可以帮助你,github.com/siyamed/android-satellite-menu/issues/3 @Hasmukh,如果假设列 id 不只是“自动增量”而是其他独特的东西......仍在使用这个解决方案吗? 这个和其他答案似乎有一个未说明的假设,即他们排序的列总是在增加。自动增量列也是如此,但并非每个表都有这样的列。【参考方案3】:

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

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

【讨论】:

当你的 SQLite 数据库有多个表时,你应该添加 WHERE = TABLE_NAME 语句 @aphoe 他不需要 WHERE = TABLE_NAME 因为“sqlite_sequence”是表引用。 我知道不能保证未排序查询中的最后一条记录将是表的最后一条记录。我敢打赌这“经常”有效。但你不能依赖它。【参考方案4】:

这是一个简单的例子,它只返回最后一行,而不需要对任何列进行排序:

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

【讨论】:

【参考方案5】:

我认为如果您使用 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

【讨论】:

【参考方案6】:

如果你已经得到了游标,那么你可以从游标中获取最后一条记录:

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

【讨论】:

有没有办法通过在 getContentResolver().query 上创建光标来获得这个? 你可以简单地使用 cursor.moveToLast();【参考方案7】:

假设您正在查找表 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;

【讨论】:

【参考方案8】:

很简单,你可以用Cursor移动moveToLast();方法提供移动到最后一条记录

cursor.moveToLast();

【讨论】:

【参考方案9】:

我想维护我的表,同时拉入一行,让我在表中的特定列中获得最后一个值。我本质上是在寻找替换 excel 中的 LAST() 函数,这很有效。

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

【讨论】:

【参考方案10】:

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

鉴于此表:

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

【讨论】:

【参考方案11】:

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

所以,要获取表中的最后一行,只需放入:

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

【讨论】:

【参考方案12】:

以前的答案 假设有一个递增的整数 ID 列,所以MAX(ID) 给出了最后一行。但有时键是文本类型,没有以可预测的方式排序。因此,为了获取最后 1 或 N 行 (#Nrows#),我们可以采用不同的方法

Select * From [#TableName#]  LIMIT #Nrows# offset cast((SELECT count(*)  FROM [#TableName#]) AS INT)- #Nrows#

【讨论】:

【参考方案13】:

另外,如果您的表没有 ID 列,或者按 id 排序不会返回最后一行,您可以随时使用 sqlite 架构原生的 'rowid' 字段。

SELECT column 
FROM table 
WHERE rowid = (SELECT MAX(rowid) FROM table);

【讨论】:

以上是关于如何从 Sqlite 获取最后一条记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Hibernate 从 Mysql 获取最后一条记录?

如何从 sql 查询中获取第一条和最后一条记录?

SQLite 如何查询最后一条数据?

如何使用 LINQ 仅从实体加载最后一条记录?

如何获取mysql中最后一条之前的最后一条记录?

Android SQLit数据库学习