Sqlite से अंतिम रिकॉर्ड कैसे प्राप्त करें?


93

मेरे पास एक टेबल है 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();
        }           
    }
});

कृपया मुझे कुछ संकेत दें।

जवाबों:


186

इसे इस्तेमाल करे:

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

या

आप निम्नलिखित समाधान का भी उपयोग कर सकते हैं:

SELECT * FROM tablename ORDER BY column DESC LIMIT 1;

25
यह उस उद्देश्य के लिए बहुत बुरा अनुरोध है क्योंकि sqliteपरिणाम वापस करने से पहले अपनी आईडी (धीमा) द्वारा सभी रिकॉर्डों को क्रमबद्ध करना चाहिए, स्टीफन गुयेन ने इष्टतम अनुरोध दिया DESCऔरLIMIT 1
आर्टेम ज़ीनतुल्लिन

@ हसमुख हाय गोविंद यहाँ .. नीचे कोने के दाईं ओर satelitemenu करना चाहते हैं ... क्या आपने किया ..?
गोविंद राठौड़

@ गोविंद यहां संदर्भ लिंक है, यह आपकी मदद कर सकता है, github.com/siyamed/android-satinery-menu/issues/3
हसमुख

@ हसमुख, अगर मान लें कि कॉलम आईडी सिर्फ 'AUTOINCREMENT' नहीं है, बल्कि कुछ और अनूठा है ... तो क्या यह समाधान काम कर रहा है?
चोलत्स्की

1
यह और अन्य उत्तर एक अस्थिर धारणा है कि जिस कॉलम को वे छांट रहे हैं, वह हमेशा बढ़ता रहता है। यह स्‍वत: स्‍पष्‍ट कॉलम के लिए सही है, लेकिन हर तालिका में ऐसा कॉलम नहीं है।
लार्स जूल

199

मुझे लगता है कि शीर्ष उत्तर थोड़ा सा है, बस इसका उपयोग करें

SELECT * FROM table ORDER BY column DESC LIMIT 1;

1
"शीर्ष उत्तर" हमेशा शीर्ष उत्तर नहीं रहता है। क्या आपका मतलब हसमुख से है?
लार्स जूल

कभी-कभी यह किसी अज्ञात कारण के लिए दूसरा-अंतिम मूल्य दे रहा है ... अधिकांश समय यह ठीक काम कर रहा है
एमएसडी

23

अपनी तालिका से अंतिम रिकॉर्ड प्राप्त करने के लिए ।।

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

जब आपकी SQLite db में एक से अधिक टेबल हो तो आपको WHERE = TABLE_NAME स्टेटमेंट जोड़ना चाहिए
aphoe

@aphoe उसे WHERE = TABLE_NAME की आवश्यकता नहीं है क्योंकि "sqlite_fterence" तालिका संदर्भ है।
एपीसबोसिन

मुझे इस बात की कोई गारंटी नहीं है कि एक अनसुलझी क्वेरी में अंतिम रिकॉर्ड तालिका का अंतिम रिकॉर्ड होगा। मैं यह काम करता हूं "अक्सर"। यद्यपि आप इस पर भरोसा नहीं कर सकते।
एंडर्स 8

11

यहाँ एक सरल उदाहरण है कि किसी भी कॉलम से किसी भी चीज़ को सॉर्ट करने की आवश्यकता के बिना बस अंतिम लाइन लौटाता है:

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

9

मुझे लगता है कि यदि आप SQLiteDatasia वर्ग से पूरे 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

theres getContentResolver () क्वेरी पर कर्सर के निर्माण के माध्यम से इसे प्राप्त करने का एक तरीका है।
राल्फगैब

आप बस का उपयोग कर सकते हैं।
अनंत शाह

2

बस सरल, आप Cursor MoveToLast () के साथ आगे बढ़ सकते हैं ; विधि पिछले रिकॉर्ड पर ले जाने के लिए प्रदान करता है

cursor.moveToLast();

2

मैं एक पंक्ति में खींचते हुए अपनी तालिका को बनाए रखना चाहता था जो मुझे तालिका में एक विशेष कॉलम में अंतिम मूल्य देता है। मैं अनिवार्य रूप LAST()से एक्सेल में फ़ंक्शन को बदलना चाहता था और यह काम किया।

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

0

sqlite में, sqlite_fterence नामक एक तालिका होती है, इस तालिका में तालिका का नाम होता है और यह अंतिम आईडी संख्या होती है (यदि आईडी स्वतः वृद्धि हुई है)।

तो, पिछली पंक्ति को केवल एक तालिका में लाने के लिए:

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

0

पिछले जवाब मान एक है कि वहाँ incrementing पूर्णांक आईडी स्तंभ है, तो MAX(ID)अंतिम पंक्ति देता है। लेकिन कभी-कभी चाबियाँ पाठ प्रकार की होती हैं , न कि पूर्वानुमानित तरीके से। तो अंतिम 1 या N पंक्तियों (# Nrows #) को लेने के लिए हम एक अलग दृष्टिकोण का पालन कर सकते हैं :

Select * From [#TableName#]  LIMIT #Nrows# offset cast((SELECT count(*)  FROM [#TableName#]) AS INT)- #Nrows#

0

एक अन्य विकल्प 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          |
+--------+--------------+
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.