Làm thế nào để lấy Bản ghi cuối cùng từ Sqlite?


95

Tôi có một bàn question_tablevà một ImageButton( Quay lại ). Tôi cần lấy bản ghi được chèn lần cuối từ cơ sở dữ liệu sau khi nhấp vào Quay lại .

Hàng của tôi chứa các cột sau: question, optionA, optionB, optionC, optionD, và tôi cần các dữ liệu để sử dụng trên của tôi Activity. Tôi tạo một phương thức trong cơ sở dữ liệu nhưng nó không hoạt động.

Đây là mã để tham khảo:

Trích xuất 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;
}

OnClickListnertừ 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();
        }           
    }
});

Xin vui lòng cho tôi một số gợi ý.

Câu trả lời:


188

Thử cái này:

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

HOẶC LÀ

bạn cũng có thể sử dụng giải pháp sau:

SELECT * FROM tablename ORDER BY column DESC LIMIT 1;

25
Đây là yêu cầu rất xấu cho mục đích đó vì sqlitephải sắp xếp tất cả hồ sơ bằng id của họ (chậm) trước khi trở về kết quả, Stephen Nguyễn đã yêu cầu tối ưu với DESCLIMIT 1
Artem Zinnatullin

@Hasmukh xin chào govind đây .. muốn làm satelitemenu ở góc phải góc dưới ... bạn đã làm chưa ..?
Govind Rathod

@Govind đây là liên kết tham khảo, nó có thể giúp bạn, github.com/siyamed/android-satellite-menu/issues/3
Hasmukh

@Hasmukh, nếu giả sử id cột đó không chỉ là 'AUTOINCREMENT' mà là một cái gì đó độc đáo khác ... thì giải pháp này vẫn hoạt động?
Choletski

1
Câu trả lời này và các câu trả lời khác dường như có một giả định không chắc chắn rằng cột mà họ sắp xếp luôn tăng lên. Điều đó đúng với các cột tự động tăng, nhưng không phải bảng nào cũng có một cột như vậy.
LarsH

201

Tôi nghĩ câu trả lời hàng đầu hơi dài dòng, chỉ cần sử dụng

SELECT * FROM table ORDER BY column DESC LIMIT 1;

1
"Câu trả lời hàng đầu" không phải lúc nào cũng là câu trả lời hàng đầu. Ý bạn là của Hasmukh?
LarsH

đôi khi nó được đưa ra các giá trị thứ hai cuối cùng đối với một số lý do nào đó ... phần lớn thời gian nó đang làm việc tốt
MSD

Nếu cột được đánh dấu AUTOINCREMENT thì tốt hơn là SELECT MAX (ID). Sử dụng CLI thực thi 'GIẢI THÍCH KẾ HOẠCH CÂU HỎI <query>' kết quả truy vấn của bạn quét toàn bộ bảng, trong khi SELECT MAX (ID) dẫn đến tìm kiếm nhanh hơn nhiều.
Brian Heilig

23

Để lấy bản ghi cuối cùng từ bảng của bạn ..

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

Bạn nên thêm câu lệnh WHERE = TABLE_NAME khi db SQLite của bạn có nhiều hơn một bảng
aphoe

@aphoe Anh ấy không cần WHERE = TABLE_NAME vì "sqlite_sequence" là tham chiếu bảng.
apkisbossin

Tôi không biết chắc rằng bản ghi cuối cùng trong một truy vấn chưa được sắp xếp sẽ là bản ghi cuối cùng của bảng. Tôi cá rằng điều này hoạt động "thường xuyên". Bạn không thể dựa vào nó mặc dù.
Anders 8

11

Đây là một ví dụ đơn giản chỉ cần trả về dòng cuối cùng mà không cần phải sắp xếp bất kỳ thứ gì từ bất kỳ cột nào:

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


8

Nếu bạn đã có con trỏ, thì đây là cách bạn có thể lấy bản ghi cuối cùng từ con trỏ:

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

có cách nào để đạt được điều này thông qua việc tạo con trỏ trên truy vấn getContentResolver ().?
ralphgabb

Bạn chỉ cần sử dụng cursor.moveToLast ();
Anant Shah

2

Cursor Đơn giản thôi, bạn có thể di chuyển bằng moveToLast (); phương thức cung cấp để chuyển đến bản ghi cuối cùng

cursor.moveToLast();

2

Tôi muốn duy trì bảng của mình trong khi kéo một hàng cung cấp cho tôi giá trị cuối cùng trong một cột cụ thể trong bảng. Về cơ bản tôi đang tìm cách thay thế LAST()hàm trong excel và điều này đã hoạt động.

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

1

Giả sử bạn đang tìm kiếm hàng cuối cùng của bảng dbstr.TABNAME, vào một cột INTEGER có tên "_ID" (ví dụ: BaseColumns._ID), nhưng có thể là bất kỳ cột nào khác mà bạn muốn.

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

Một tùy chọn khác là sử dụng LAST_VALUE()hàm SQLites theo cách sau.

Với bảng này:

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

Bạn có thể nhận được trạng thái cuối cùng của mọi đối tượng với truy vấn sau

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

Kết quả sẽ như sau:

+--------+--------------+
| OBJECT |  LAST_STATUS |
+--------+--------------+
|        |              |
| 1      |  ON          |
|        |              |
| 2      |  ON          |
|        |              |
| 3      |  ON          |
+--------+--------------+

0

trong sqlite, có một bảng được gọi là sqlite_sequence, bảng này chứa tên bảng và đó là số id cuối cùng (nếu id được tăng tự động).

Vì vậy, để có hàng cuối cùng trong bảng chỉ cần đặt:

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

0

Các câu trả lời trước đó giả định rằng có một cột ID số nguyên tăng dần , vì vậy hãy MAX(ID)đưa ra hàng cuối cùng. Nhưng đôi khi các phím thuộc loại văn bản , không được sắp xếp theo cách dễ đoán. Vì vậy, để lấy 1 hoặc N hàng cuối cùng (# Nrows #), chúng ta có thể làm theo một cách tiếp cận khác :

Select * From [#TableName#]  LIMIT #Nrows# offset cast((SELECT count(*)  FROM [#TableName#]) AS INT)- #Nrows#
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.