จะรับบันทึกล่าสุดจาก 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();
        }           
    }
});

ขอคำแนะนำหน่อย

คำตอบ:


188

ลองสิ่งนี้:

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

หรือ

คุณยังสามารถใช้วิธีแก้ปัญหาต่อไปนี้:

SELECT * FROM tablename ORDER BY column DESC LIMIT 1;

25
นี้เป็นคำขอที่เลวร้ายมากสำหรับวัตถุประสงค์ที่เพราะsqliteควรเรียงลำดับระเบียนทั้งหมดของคุณ id ของพวกเขา (ช้า) ก่อนที่จะกลับมาส่งผลให้สตีเฟ่นเหงียนให้ดีที่สุดกับการร้องขอDESCและLIMIT 1
Artem Zinnatullin

@Hasmukh สวัสดี govind ที่นี่ .. อยากทำ satelitemenu ที่มุมขวาล่าง ... ทำไปแล้ว .. ?
Govind Rathod

@Govind นี่คือลิงค์อ้างอิงมันอาจช่วยคุณได้github.com/siyamed/android-satellite-menu/issues/3
Hasmukh

@Hasmukh ถ้าสมมติว่ารหัสคอลัมน์ไม่ใช่แค่ 'AUTOINCREMENT' แต่มีอย่างอื่นที่ไม่เหมือนใคร ... ยังคงใช้งานโซลูชันนี้ได้หรือไม่
Choletski

1
คำตอบนี้และคำตอบอื่น ๆ ดูเหมือนจะมีข้อสันนิษฐานที่ไม่ได้ระบุไว้ว่าคอลัมน์ที่พวกเขากำลังเรียงลำดับนั้นเพิ่มขึ้นอยู่เสมอ นั่นเป็นความจริงของคอลัมน์การสร้างอัตโนมัติ แต่ไม่ใช่ทุกตารางจะมีคอลัมน์แบบนั้น
LarsH

206

ฉันคิดว่าคำตอบด้านบนนั้นค่อนข้างละเอียดเพียงแค่ใช้สิ่งนี้

SELECT * FROM table ORDER BY column DESC LIMIT 1;

1
"คำตอบยอดนิยม" ไม่ได้เป็นคำตอบยอดนิยมเสมอไป คุณหมายถึง Hasmukh's?
LarsH

บางครั้งมันก็ให้ค่าที่สอง - สุดท้ายด้วยเหตุผลบางอย่างที่ไม่ทราบสาเหตุ ... ส่วนใหญ่จะใช้งานได้ดี
MSD

หากคอลัมน์ถูกทำเครื่องหมาย AUTOINCREMENT ดังนั้น SELECT MAX (ID) จะดีกว่า การใช้ CLI เรียกใช้ 'EXPLAIN QUERY PLAN <query>' ผลลัพธ์การค้นหาของคุณในการสแกนแบบเต็มตารางในขณะที่ SELECT MAX (ID) จะทำให้การค้นหาเร็วขึ้นมาก
Brian Heilig

23

เพื่อรับบันทึกล่าสุดจากตารางของคุณ ..

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

คุณควรเพิ่มคำสั่ง WHERE = TABLE_NAME เมื่อฐานข้อมูล SQLite ของคุณมีมากกว่าหนึ่งตาราง
aphoe

@aphoe เขาไม่ต้องการ WHERE = TABLE_NAME เพราะ "sqlite_sequence" คือการอ้างอิงตาราง
apkisbossin

ฉันไม่ทราบการรับประกันว่าระเบียนสุดท้ายในแบบสอบถามที่ไม่ได้เรียงลำดับจะเป็นระเบียนสุดท้ายของตาราง ฉันพนันได้เลยว่า "มักจะ" คุณไม่สามารถพึ่งพามันได้
Anders8

13

นี่คือตัวอย่างง่ายๆที่ส่งกลับบรรทัดสุดท้ายโดยไม่จำเป็นต้องเรียงลำดับอะไรจากคอลัมน์ใด ๆ :

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

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

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

ฉันต้องการรักษาตารางของฉันในขณะที่ดึงแถวหนึ่งซึ่งให้ค่าสุดท้ายในคอลัมน์เฉพาะในตาราง โดยพื้นฐานแล้วฉันต้องการแทนที่LAST()ฟังก์ชันใน excel และได้ผล

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

1

อีกทางเลือกหนึ่งคือการใช้ 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          |
+--------+--------------+

0

ใน sqlite มีตารางที่เรียกว่า sqlite_sequence ตารางนี้มีชื่อตารางและเป็นหมายเลขรหัสสุดท้าย (ถ้า id นั้นเพิ่มขึ้นโดยอัตโนมัติ)

ดังนั้นเพื่อให้ได้แถวสุดท้ายในตารางให้ใส่:

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

0

คำตอบก่อน สมมติว่ามีการเพิ่มจำนวนเต็มคอลัมน์รหัสเพื่อMAX(ID)ให้แถวสุดท้าย แต่บางครั้งปุ่มก็เป็นประเภทข้อความไม่ได้เรียงลำดับแบบคาดเดา ดังนั้นในการรับ 1 หรือ N แถวสุดท้าย (# Nrows #) เราสามารถทำตามวิธีการอื่น :

Select * From [#TableName#]  LIMIT #Nrows# offset cast((SELECT count(*)  FROM [#TableName#]) AS INT)- #Nrows#
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.