2012-12-24 27 views
17

मेरे पास मेरे एंड्रॉइड एप्लिकेशन में एक डेटाबेस सहेजा गया है और डीबी में डाले गए अंतिम 10 संदेशों को पुनर्प्राप्त करना चाहते हैं।एंड्रॉइड SQLite क्वेरी - नवीनतम 10 रिकॉर्ड प्राप्त करना

जब मैं का उपयोग करें:

Select * from tblmessage DESC limit 10; 

यह मुझे 10 संदेश देता है, लेकिन टॉप से। लेकिन मुझे LAST 10 संदेश चाहिए। क्या यह संभव है?

मान लीजिए पूरे तालिका डेटा है -

1,2,3,4,5....30 

मैं क्वेरी लिखा select * from tblmessage where timestamp desc limit 10

यह 30,29,28...21

से पता चलता लेकिन मैं के रूप में अनुक्रम चाहते हैं - 21,22,23...30

+8

आप अपने प्रश्न के रूप में ORDER BY खंड का उपयोग कर बदलना होगा 'tblmessage आदेश से चयन * द्वारा _ id DESC सीमा से 10' –

+0

मुझे लगता है कि मेरी तालिका कोई _id कॉलम नहीं बना रही है। – Darpan

उत्तर

30

डीईएससी को एएससी में बदलें और आपको वह रिकॉर्ड मिलेगा जो आप चाहते हैं, लेकिन यदि आपको उन्हें आदेश देने की आवश्यकता है, तो आपको उस क्रम को उलट करने की आवश्यकता होगी जिसमें आप आते हैं। आप या तो अपने कोड में या बस ऐसा कर सकते हैं अपनी क्वेरी को इस प्रकार विस्तारित करें:

select * from (select * from tblmessage order by sortfield ASC limit 10) order by sortfield DESC; 

आपको वास्तव में केवल एएससी या डीईएससी नहीं, खंड द्वारा ऑर्डर निर्दिष्ट करना चाहिए।

+0

मैं उनके द्वारा आने वाले क्रम को उलट करना चाहता हूं। मैं कैसे कर सकता हूं> –

+1

मान लीजिए कि संपूर्ण तालिका डेटा है - 1,2,3,4,5 .... 30 मैंने tblmessage से क्वेरी चयन * लिखा जहां टाइमस्टैम्प desc सीमा 10 यह 30,29,28 से पता चलता ... 21 लेकिन मैं के रूप में अनुक्रम चाहते हैं - 21,22,23 ... 30 कैसे मैं एक ही –

+1

बहुत बढ़िया प्राप्त कर सकते हैं! मुझे पता नहीं था कि आप इस तरह से घोंसला चुन सकते हैं। –

1

इस,

प्रयास करें
SQLiteDatabase database = getReadableDatabase(); 
Cursor c=database.rawQuery("sql Query", null); 
if(c.moveToFirst) { 
    int curSize=c.getCount() // return no of rows 
    if(curSize>10) { 
     int lastTenValue=curSize -10; 
     for(int i=0;i<lastTenValue;i++){ 
      c.moveToNext(); 
     } 
    } else { 
     c.moveToFirst(); 
    } 
} 

फिर अंतिम 10 डेटा पुनर्प्राप्त करें।

0

आपकी क्वेरी में, DESC को तालिका उपनाम के रूप में व्याख्याित किया गया है।

कश्मीर ρяσѕρєя, एक छँटाई दिशा निर्दिष्ट करने के लिए सक्षम होने के लिए द्वारा उल्लेख किया है, आप एक ORDER BY खंड के साथ पहले स्थान पर सॉर्ट करने के लिए की जरूरत है।

सॉर्ट किए जाने वाले कॉलम को टाइमस्टैम्प होना चाहिए, यदि आपके पास कोई है, या तालिका की प्राथमिक कुंजी जैसे ऑटोइनक्रिकमेंटिंग कॉलम होना चाहिए। बड़े डेटाबेस पर

20

, ORDER BY DESC कथन वास्तव में सिस्टम को धीमा कर सकता है, उदा। रास्पबेरी पाई। ORDER BY से बचने के लिए एक अच्छा तरीका OFFSET कमांड है।और तुम भी संग्रहीत आदेश रखें:

SELECT * FROM mytable LIMIT 10 OFFSET (SELECT COUNT(*) FROM mytable)-10; 

देखें:

select * from (select * from tblmessage order by sortfield DESC limit 10) order by sortfield ASC; 

माइकल डिलन था:

.timer ON 
+0

देखें इस में ऑफसेट नकारात्मक हो सकता है जो – Atul

+0

अपवाद बढ़ा सकता है बेशक आप ऊपरी और निचली सीमाओं से मूल्यों को कॉल कर सकते हैं। हालांकि स्क्लाइट एक अपवाद नहीं फेंकता है, लेकिन सभी मूल्यों को संभव बनाता है। – McPeppr

+0

मैंने इस विकल्प का उपयोग किया, और यह वैसे ही काम करता है जैसा मैं चाहता हूं। यह अभी भी नकारात्मक मूल्यों से सुरक्षित है। –

5

थोड़ा सुधार हुआ जवाब: http://www.sqlite.org/lang_select.html

के साथ अपने प्रदर्शन से बाहर की जांच his answer में सही विचार, लेकिन उदाहरण पहली पंक्तियों को देता है, इनव rted आदेश:

select * ... (select * ... ASC limit 10) ... DESC 

वह पिछले चाहता था, यह होना चाहिए:

अपनी मेज प्राथमिक कुंजी autoincrement (कुछ उदाहरण के लिए "row_id") के साथ एक कॉलम होता है
select * ... (select * ... DESC limit 10) ... ASC 
+0

हाँ - चुनें * ... (चुनें * ... डीईएससी सीमा 10) ... एएससी –

1

हैं तो आप सिर्फ एक का चयन की जरूरत है इस स्तंभ

कच्चे अनुरोध

तरह
select * from table_name order by row_id DESC limit 10 

एंड्रॉयड impl लग रहा द्वारा DESC आदेश के साथ ementation

private Cursor queryLastEvents() { 
    return getDatabase().query("table_name", null, null, null, null, null, "row_id DESC", "10"); 
} 
+0

यह पिछले 10 रिकॉर्ड देगा लेकिन रिवर्स ऑर्डर में। – Atul

0
select * from 
(select * from table_name order by yourfield ASC limit 10) 
order by yourfield DESC; 

है आप इस तुलना में बेहतर समाधान नहीं हो सकता।

+0

महान समाधान .. – rs11

0
cursor.moveToLast(); 
while (cursor.moveToPrevious()){ 
     //do something 
} 

समान क्वेरी के साथ : चयन * tblmessage जहां टाइमस्टैम्प desc सीमा 10

+0

इस बारे में कुछ टिप्पणी क्यों सही जवाब है, प्रश्न पूछने वाले व्यक्ति की मदद कर सकता है – joanolo

+0

मुझे चैटिंग ऐप में भी एक ही प्रकार की समस्या का सामना करना पड़ता है। लेकिन मैं यह कर्सर कर रहा हूं। MoveToLast(); जबकि (cursor.moveToPrevious()) { // कुछ करें } –