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.