Sqlite에서 마지막 기록을 얻는 방법?


95

나는 하나의 테이블 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로 모든 레코드를 정렬한다, 스티븐 응우 함께 최적의 요청을했다 DESCLIMIT 1
아르 템 Zinnatullin에게

@Hasmukh 안녕하세요 govind 여기 .. ​​하단 모서리의 오른쪽에있는 satelitemenu를하고 싶습니다 ... 해냈나요 ..?
Govind Rathod 2014 년

@Govind 여기에 참조 링크, 그것은 당신을 도움이 될 수 github.com/siyamed/android-satellite-menu/issues/3
Hasmukh

@Hasmukh, 열 id가 'AUTOINCREMENT'가 아니라 다른 고유 한 것이 있다고 가정하면 ...이 솔루션이 여전히 작동합니까?
Choletski

1
이 답변과 다른 답변은 정렬하는 열이 항상 증가하고 있다는 명시되지 않은 가정을 가지고있는 것 같습니다. 자동 증가 열의 경우에도 마찬가지지만 모든 테이블에 이와 같은 열이있는 것은 아닙니다.
LarsH

201

정답이 약간 장황하다고 생각합니다.

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

SQLite db에 두 개 이상의 테이블이있는 경우 WHERE = TABLE_NAME 문을 추가해야합니다
aphoe aphoe

@aphoe "sqlite_sequence"가 테이블 참조이므로 WHERE = TABLE_NAME이 필요하지 않습니다.
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에 커서를 생성하여 이것을 얻는 방법이 있습니까?
ralphgabb 2015

간단히 cursor.moveToLast ();
Anant Shah

2

간단하게 Cursor moveToLast (); 방법은 마지막 기록으로 이동하는 것을 제공합니다

cursor.moveToLast();

2

테이블의 특정 열에서 마지막 값을 제공하는 한 행을 가져 오는 동안 테이블을 유지하고 싶었습니다. 본질적으로 LAST()Excel 에서 기능 을 대체하려고 했는데 이것이 효과가있었습니다.

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

1

dbstr.TABNAME 테이블의 마지막 행을 "_ID"(예 : BaseColumns._ID)라는 INTEGER 열에서 찾고 있지만 원하는 다른 열이 될 수 있다고 가정합니다.

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

또 다른 옵션은 LAST_VALUE()다음과 같은 방법으로 SQLites 기능 을 사용 하는 것입니다.

이 테이블이 주어지면 :

+--------+---------+-------+
| 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 번호가 포함됩니다 (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#
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.