महत्वपूर्ण पहलू टेबल या टेबल नहीं है बल्कि क्वेरी ही है जो कॉलम ऑर्डर को निर्धारित करती है।
उदाहरण के लिए यदि क्वेरी SELECT * FROM your_table
. पर आधारित थी (और तालिका में कॉलम को आईडी, गीतनाम, गीत वर्ष, गीतपथ के रूप में परिभाषित किया गया था) तो कॉलमड कर्सर परिभाषा के अनुसार होगा।
हालाँकि, यदि आपने SELECT songname, songpath, songid, songyear FROM your_table;
आदेश चयन . के अनुसार होगा कथन यानी गीत का नाम (0), गीतपथ (1), गीत (2), गीत वर्ष (3)।
हालाँकि, यह उन मुद्दों में से एक है, जिसमें आप SELECT के अनुसार ऑर्डर से बंधे हुए ऑफ़सेट का उपयोग कर रहे हैं।
अब यदि आपने कर्सर के getColumnIndex . का उपयोग किया है विधि तब कॉलम ऑफ़सेट को उसके नाम के अनुसार लौटाती है।
तो cursor.getString(cursor.getColumnIndex("songpath"));
कर्सर में इसकी ऑफ़सेट/स्थिति पर ध्यान दिए बिना songpath कॉलम प्राप्त करेगा (यदि कर्सर में वह कॉलम शामिल है)।
अपने पिछले प्रश्न को याद करते हुए मूल रूप से आपके पास SELECT songpath FROM your_table
, जैसे परिणामी कर्सर में केवल एक कॉलम है, इसलिए आप केवल प्राप्त करें का उपयोग कर सकते हैं :-
cursor.getString(0);
या :-
cursor.getString(cursor.getColumnIndex("songpath"));
उत्तरार्द्ध अनुशंसित विधि है (लेकिन आदर्श रूप से स्तंभ नाम स्थिरांक के रूप में परिभाषित होते हैं)
हालांकि मामले और अधिक जटिल हो सकते हैं, उदाहरण के लिए इस पर विचार करें
SELECT songpath||songname AS myconfusingcolumn FROM yourtable;
यह myconfusingcolumn नामक एक एकल कॉलम लौटाएगा जिसमें गीतनाम के साथ गीतपथ शामिल होता है। वह यह है कि AS कीवर्ड के बाद कॉलम के लिए एक उपनाम होता है (AS के बिना कॉलम नाम और भी भ्रमित/कठिन होगा क्योंकि यह songpath||songname होगा) (यह उदाहरण अपेक्षाकृत सरल है)।
सावधान रहने की एक और बात है, अस्पष्ट कॉलम (डुप्लिकेट कॉलम नाम) उदाहरण के लिए, यदि आपके पास दो टेबल गीत और कलाकार और गीत अतिरिक्त कॉलम कलाकार_आईडी है तो आपके पास :-
गीत कॉलम वाली तालिका id , गीतनाम , गीत वर्ष , गीतपथ , artist_id
कलाकार कॉलम वाली तालिका id और कलाकार_नाम
और फिर आपने इस्तेमाल किया
SELECT * FROM song JOIN artist ON song.artist_id = artist.id;
- ध्यान दें कि आईडी . के रूप में कलाकार . का स्तंभ तालिका, यदि कथन में उपयोग की जाती है, तो इसे संबंधित तालिका नाम के साथ उपसर्ग करना होगा अन्यथा एक अस्पष्ट स्तंभ त्रुटि उत्पन्न होगी अर्थात SQL पार्सर को पता नहीं चलेगा कि कौन सी id कॉलम आपका मतलब है।
इसके अलावा आप कॉलम वाले कर्सर के साथ समाप्त होंगे :-
आईडी , गीत का नाम, गीत वर्ष, गीतपथ, कलाकार_आईडी, आईडी , कलाकार_नाम
csr.getLong(csr.getColumnIndex("id")); could get confused (I believe it actually gets the last AMBIGUOUS column)
long songid = csr.getLong(0); would get the id column from the song table.
long artistid = csr.getLong(5); would get the id column from the artist table.
long artistid = csr.getLong(4); would also get the artist_id same as (5).
संक्षिप्त/सारांशित करने के लिए :-
कर्सर में कॉलम, ऑर्डर और नाम पूरी तरह से सेलेक्ट क्वेरी पर निर्भर होते हैं। क्वेरी के अनुसार उनके पास ऑफ़सेट और नाम होगा। कर्सर को एक्सेस करते समय अंतर्निहित तालिका नाम केवल कॉलम नाम या ऑफ़सेट का उपयोग करने योग्य नहीं होते हैं।
स्तंभों को उनके नाम से एक्सेस करना उनके ऑफस्टेस के बजाय उनके नाम से अधिक लचीला है . यानी कर्सर के getColumnIndex . का उपयोग करें विधि के रूप में यह ऑफ़सेट की गणना करने की आवश्यकता को नकारता है और अधिक विशेष रूप से अनुपलब्ध पुन:गणना को एक क्वेरी को बदला जाना चाहिए।
कॉलम नामों के लिए CONSTANTS का उपयोग करने से टाइपिंग त्रुटियों जैसे मुद्दों में कमी आने की संभावना है।
अतिरिक्त
Toast.makeText(this, mListSongs+"", Toast.LENGTH_SHORT).show();
का उपयोग करना
असामान्य परिणाम मिलेगा [{}] क्योंकि mListSongs गानों के लिए संपूर्ण कंटेनर है। आपको प्रत्येक तत्व को लूप करने की आवश्यकता है और फिर तत्व (गीत वस्तु) से प्रत्येक सदस्य/चर के लिए गुण/मान प्राप्त करें।