Sqlite'den Son Kayıt Nasıl Alınır?


96

Bir masam question_tableve bir masam var ImageButton( Geri ). Ben tıkladıktan sonra veritabanından son eklenen kaydını almak gerekir Geri .

Benim satır aşağıdaki sütunları içerir: question, optionA, optionB,optionC , optionD, ve ben on my kullanılmak üzere veri gerekir Activity. Veritabanında bir yöntem oluşturuyorum ama çalışmıyor.

İşte referans kodu:

MySQLiteHelper.java özü:

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

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

Lütfen bana biraz ipucu ver.

Yanıtlar:


188

Bunu dene:

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

VEYA

aşağıdaki çözümü de kullanabilirsiniz:

SELECT * FROM tablename ORDER BY column DESC LIMIT 1;

25
Bu amaç için çok kötü bir istek çünkü sqlitesonucu döndürmeden önce tüm kayıtları kendi kimliklerine (yavaş) göre sıralaması gerekiyor, Stephen Nguyen DESCveLIMIT 1
Artem Zinnatullin

@Hasmukh merhaba govind burada .. alt köşenin sağında uydu menüsü yapmak istiyorum ... yaptın mı ..?
Govind Rathod

@Govind burada referans link, o size yardımcı olabilecek github.com/siyamed/android-satellite-menu/issues/3
Hasmukh

@Hasmukh, eğer sütun kimliğinin sadece 'OTOMATİK EKLEME' olmadığını, aynı zamanda benzersiz başka bir şey olduğunu varsayarsak ... bu çözüm hala çalışıyor mu?
Choletski

1
Görünüşe göre bu ve diğer yanıtlar, sıraladıkları sütunun her zaman artmakta olduğu şeklindeki açıklanmamış bir varsayıma sahip. Bu, otomatik artış sütunları için doğrudur, ancak her tabloda böyle bir sütun yoktur.
LarsH

209

En iyi cevabın biraz ayrıntılı olduğunu düşünüyorum, sadece şunu kullan

SELECT * FROM table ORDER BY column DESC LIMIT 1;

1
"En iyi cevap" her zaman en iyi cevap olarak kalmaz. Hasmukh's mu demek istiyorsun?
LarsH

bazen bilinmeyen bir nedenle ikinci-son değeri veriyor ... çoğu zaman sorunsuz çalışıyor
MSD

Sütun OTOMATİK EKLEME olarak işaretlenmişse, MAX SEÇ (ID) daha iyidir. CLI'yi kullanmak 'SORGU PLANI <query>' yi çalıştırdığınızda, sorgunuz tam bir tablo taramasıyla sonuçlanırken, SELECT MAX (ID) çok daha hızlı bir aramayla sonuçlanır.
Brian Heilig

23

Tablonuzdan son kaydı almak için ..

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


@aphoe WHERE = TABLE_NAME'e ihtiyacı yok çünkü "sqlite_sequence" tablo referansıdır.
apkisbossin

Sıralanmamış bir sorgudaki son kaydın tablonun son kaydı olacağına dair hiçbir garanti bilmiyorum. Eminim bu "sık sık" işe yarar. Yine de ona güvenemezsin.
Anders8

14

Herhangi bir sütundan herhangi bir şeyi sıralamanıza gerek kalmadan son satırı döndüren basit bir örnek:

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


8

İmleci zaten aldıysanız, imleçten son kaydı şu şekilde alabilirsiniz:

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

getContentResolver (). sorgusunda imleç oluşturarak bunu elde etmenin bir yolu var mı?
ralphgabb

Sadece cursor.moveToLast ();
Anant Shah

2

Dbstr.TABNAME tablosunun son satırını "_ID" adlı bir INTEGER sütununa (örneğin BaseColumns._ID) aradığınızı varsayalım, ancak istediğiniz herhangi bir sütun olabilir.

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

Sadece basit, Cursor moveToLast () ile hareket edebilirsiniz ; yöntem son kayda geçmeyi sağlar

cursor.moveToLast();

2

Tablodaki belirli bir sütundaki son değeri veren bir satır çekerken tablomu korumak istedim. Esasen LAST()excel'deki işlevi değiştirmek istiyordum ve bu işe yaradı.

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

1

Diğer bir seçenek de SQLite kullanmaktır LAST_VALUE() fonksiyonunu aşağıdaki şekilde kullanmaktır.

Bu tabloya göre:

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

Her nesnenin son durumunu aşağıdaki sorgu ile alabilirsiniz.

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

Sonuç şöyle görünecektir:

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

0

sqlite'de sqlite_sequence adında bir tablo vardır, bu tablo tablo adını ve son id numarasını içerir (eğer id otomatik olarak artırılmışsa).

Yani, bir tablodaki son satırı elde etmek için şunu koyun:

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

0

Önceki cevaplar varsayalım bir olduğunu artan tamsayı böylece, kimlik sütunu MAX(ID)son satırı verir. Ancak bazen anahtarlar metin türündedir ve tahmin edilebilir bir şekilde sıralanmamıştır. Dolayısıyla, son 1 veya N satırı (# Nrows #) almak için farklı bir yaklaşım izleyebiliriz :

Select * From [#TableName#]  LIMIT #Nrows# offset cast((SELECT count(*)  FROM [#TableName#]) AS INT)- #Nrows#
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.