Sqliteから最後のレコードを取得する方法?


93

1つのテーブルquestion_tableと1つのImageButton戻る)があります。[ 戻る ]をクリックした後、最後に挿入したレコードをデータベースから取得する必要があります。

私の行は次の列が含まれていますquestionoptionAoptionBoptionCoptionD、と私は私の上で使用するデータを必要としますActivity。データベースにメソッドを1つ作成しましたが、機能しません。

参照用のコードは次のとおりです。

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;
}

OnClickListnerAddQuestionActivity.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();
        }           
    }
});

ヒントをください。

回答:


186

これを試して:

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

または

次のソリューションを使用することもできます:

SELECT * FROM tablename ORDER BY column DESC LIMIT 1;

25
sqlite結果を返す前にすべてのレコードをID(遅い)でソートする必要があるため、これはその目的にとって非常に悪い要求ですDESCLIMIT 1
。StephenNguyenは

@Hasmukh hi govind here ..右下のsatelitemenuを実行したい...あなたはそれをしましたか..?
Govind Rathod 2014

@Govindは参照リンクです。github.com
siyamed /

@Hasmukh、その列IDが「AUTOINCREMENT」だけでなく、他にユニークなものであると仮定した場合...このソリューションはまだ機能していますか?
Choletski、2016年

1
この回答やその他の回答には、並べ替えの対象となる列が常に増加しているという明言されていない仮定があるようです。これは自動インクリメント列にも当てはまりますが、すべてのテーブルにそのような列があるわけではありません。
LarsH

199

上の答えは少し冗長だと思います、これを使用してください

SELECT * FROM table ORDER BY column DESC LIMIT 1;

1
「トップアンサー」が常にトップアンサーであるとは限りません。ハスムフのことですか?
LarsH

時々、それは何らかの未知の理由で最後から2番目の値を与えています...ほとんどの場合、それは正常に機能しています
MSD

23

テーブルから最後のレコードを取得する。

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

あなたのSQLiteのDBが複数の表があるときは、WHERE = TABLE_NAME文を追加する必要があります
aphoe

@aphoe「sqlite_sequence」がテーブル参照であるため、彼はWHERE = TABLE_NAMEを必要としません。
apkisbossin 2016年

ソートされていないクエリの最後のレコードがテーブルの最後のレコードになる保証はありません。これは「よく」機能するに違いない。あなたはそれに頼ることはできません。
Anders8 2018

11

以下は、列から何もソートする必要なしに最後の行を返す単純な例です。

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


8

すでにカーソルを取得している場合、これはカーソルから最後のレコードを取得する方法です。

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

getContentResolver()。queryにカーソルを作成してこれを取得する方法はありますか?
ラルフガブ2015

単にcursor.moveToLast();を使用できます。
Anant Shah


2

テーブルの特定の列の最後の値を取得する1つの行をプルしている間、テーブルを維持したいと思いました。私は本質的にLAST()Excel の機能を置き換えることを探していましたが、これはうまくいきました。

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

1

テーブル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;
}

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#

0

別のオプションは、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          |
+--------+--------------+
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.