2011-09-27 12 views
11

संभव डुप्लिकेट:
Get generated id after insertएंड्रॉयड SQLite मिल पिछले पंक्ति सम्मिलित करें आईडी

मैं इस कोड का उपयोग मेरी Android एप्लिकेशन में पिछले डाला पंक्ति आईडी प्राप्त करना चाहते हैं:

String query = "SELECT * from SQLITE_SEQUENCE"; 
int createdUserId = Integer.parseInt(dbHelper.executeSQLQuery(query).toString()); 

लेकिन समस्या यह है कि यह एक अपवाद फेंकता है जो dbHelper.executeSQLQuery(query).toString() को परिवर्तित नहीं कर सकता पूर्णांक। मैं स्क्लाइट में वास्तव में अच्छा नहीं हूं, लेकिन मुझे लगता है कि इसे डाली गई अंतिम पंक्ति आईडी वापस करनी चाहिए ... जो निश्चित रूप से int (कम से कम मुझे इस तरह से लगता है) होगा। तो अगर यह सही तरीका नहीं है, तो क्या कोई मुझे मार्गदर्शन कर सकता है कि एंड्रॉइड एप्लिकेशन में अंतिम पंक्ति आईडी कैसे प्राप्त करें।

धन्यवाद !!!

+0

डीबीहेल्पर का उदाहरण क्या है? – Squonk

+3

क्यों 'चयन' कथन * सम्मिलित * कुछ भी होगा? आप वास्तव में * सम्मिलित हैं तो * के साथ कुछ का कहना है कि 'SQLiteDatabase.insert (...)' वापस पहुंचने के लिए चाहते हैं "नव डाला पंक्ति, या -1 अगर कोई त्रुटि हो गई की पंक्ति आईडी"। –

+0

@MisterSquonk यह मेरे डेटाबेसहेल्पर क्लास का एक उदाहरण है। –

उत्तर

34

आपका एसक्यूएल स्टेटमेंट सभी पंक्ति आईडी को वापस नहीं करेगा, न केवल नवीनतम। कुछ इस तरह का प्रयास करें ...

SELECT ROWID from SQL_LITE_SEQUENCE order by ROWID DESC limit 1 

यह भी ध्यान रखें मुझे विश्वास है कि SQL_LITE_SEQUENCE से चयन किसी भी तालिका से नवीनतम आईडी मिल जाएगा, आप भी किसी भी मेज पर ROWID का चयन करके और हो रही बस के लिए आईडी के आधार पर SQL_LITE_SEQUENCE उपयोग कर सकते हैं वह टेबल आईई

SELECT ROWID from MYTABLE order by ROWID DESC limit 1 

और टिप्पणियों में अगले कदम की ओर इशारा है तो उसे यहां बाद में संदर्भ में आसानी के लिए जोड़ने के लिए MisterSquonk करने के लिए धन्यवाद ...

क्वेरी बयान तो परिणाम से युक्त एक कर्सर वस्तु वापस आ जाएगी, इसलिए पूर्णांक मान आप (मैं तो बस दूसरों के लिए, अपने सहायक विधि के लिए और अधिक सामान्य तरीके स्थानापन्न करेंगे) कुछ इस तरह

String query = "SELECT ROWID from MYTABLE order by ROWID DESC limit 1"; 
Cursor c = db.rawQuery(query); 
if (c != null && c.moveToFirst()) { 
    lastId = c.getLong(0); //The 0 is the column index, we only have 1 column, so the index is 0 
} 

(नोट करना होगा उपयोग करने के लिए है कि हालांकि एसक्यूएल लाइट डॉक्स फोन ROWID और पूर्णांक, यह एक 64 बिट पूर्णांक है, इसलिए जावा में एक लंबे समय के रूप में पुनर्प्राप्त किया जाना चाहिए।)

+0

परमाणु, असुरक्षित नहीं। संपादित करें: डाउनवोट हटा दिया गया, मैंने सोचा कि एक और बात पूछ रही थी। –

+0

एक सैद्धांतिक संभावना है कि यह सही उत्तर नहीं दे सकता है, क्योंकि अगर डेटाबेस से पंक्तियों को हटा दिया जाता है और फिर बड़ी पंक्तियों को जोड़ दिया जाता है, तो भारी मात्रा में आवेषण के बाद पंक्तिबद्ध अपनी सीमा तक पहुंच सकता है जिस बिंदु पर स्क्लाइट यादृच्छिक चुनने का प्रयास करेगा थोड़ी देर के लिए उपयोग करने के लिए पंक्तिबद्ध स्लॉट। ऐसा होना चाहिए तो जाहिर है कि आखिरी डाली गई पंक्ति में सबसे बड़ा संख्यात्मक मूल्य नहीं है और इस प्रकार केवल पंक्ति आईडी को सॉर्ट करना पर्याप्त नहीं होगा। [SQLite में Autoincrement] (https://www.sqlite.org/autoinc.html) – Timo

12

"selectlast_insert_rowid()" का उपयोग करने के लिए देखभाल? :)

+0

अरे क्या आप इसे थोड़ा सा समझा सकते हैं, इसे कैसे निष्पादित करें? मैं फ़्लोटिंग कोडर के जवाब से कोशिश कर रहा हूं, लेकिन यह निष्पादित नहीं हो रहा है :( –

+0

क्षमा करें, लेकिन मुझे यकीन नहीं है कि आपकी समस्या क्या है। शायद आपको नया प्रश्न खोलना चाहिए जहां आप समस्या के बारे में अधिक जानकारी दे सकते हैं। – JimmyB

+1

यह सही क्वेरी है: ROWID DESC सीमा 1 –

संबंधित मुद्दे