2012-09-16 14 views
16

मैं एक प्रोग्रामिंग नौसिखिया हूँ में moveToFirst() का प्रयोग होता है और मैं इंटरनेट में कोड के इस टुकड़े मिल गया है और यह ठीकक्या SQLite कर्सर

Cursor c=db.query(DataBase.TB_NAME, new String[] {DataBase.KEY_ROWID,DataBase.KEY_RATE}, DataBase.KEY_ROWID+"= 1", null, null, null, null); 
     if(c!=null) 
     { 
      c.moveToFirst(); 
     } 

काम करता है, लेकिन मैं उपयोग को समझने में सक्षम नहीं हूँ

if(c!=null) 
    { 
     c.moveToFirst(); 
    } 

भाग। क्या यह वास्तव में क्या करता है, और अगर मैं

if(c!=null) { c.moveToFirst(); } 

हिस्से को हटाने, कोड काम नहीं करता।

उत्तर

50

SQLiteDatabase.query() के लिये दस्तावेज का कहना है कि क्वेरी तरीकों वापसी: "। एक कर्सर वस्तु है, जो पहले प्रवेश करने से पहले स्थिति में है"

कॉलिंग moveToFirst() दो चीजें करता है: यह आपको यह जांचने की अनुमति देता है कि क्वेरी ने एक खाली सेट (वापसी मूल्य का परीक्षण करके) वापस कर दिया है और यह कर्सर को पहले परिणाम (जब सेट खाली नहीं है) में ले जाता है। ध्यान दें कि एक खाली रिटर्न सेट के खिलाफ सुरक्षा के लिए, आपके द्वारा पोस्ट किया गया कोड वापसी मूल्य का परीक्षण करना चाहिए (जो यह नहीं कर रहा है)।

moveToFirst() पर कॉल के विपरीत, if(c!=null) के लिए परीक्षण बेकार है; query() या तो Cursor ऑब्जेक्ट लौटाएगा या यह एक अपवाद फेंक देगा। यह कभी भी null वापस नहीं करेगा।

+0

महान है, धन्यवाद भी मुझे के 'अगर काम कर बता' – Aswin

+2

@Aswin (ग = अशक्त!) - हो गया। 'शून्य' के लिए परीक्षण बेकार है। आप कॉल को 'if' के बाहर 'moveToFirst()' पर ले जा सकते हैं और' if' से छुटकारा पा सकते हैं। –

+0

कर्सर के लिए अच्छा स्पष्टीकरण और इसकी त्रुटि हैंडलिंग – Zoombie

0

कर्सर क्वेरी के परिणाम की पंक्ति नहीं है। कर्सर एक ऐसा ऑब्जेक्ट है जो आपकी क्वेरी के परिणाम पंक्तियों पर पुन: सक्रिय हो सकता है। कर्सर प्रत्येक पंक्ति में स्थानांतरित कर सकते हैं। .moveToFirst() विधि इसे परिणाम तालिका की पहली पंक्ति में ले जाएं।

8
if (c.moveToFirst()) { 
    while(!c.isAfterLast()) { // If you use c.moveToNext() here, you will bypass the first row, which is WRONG 
    ... 
    c.moveToNext(); 
    } 
} 
-1

क्या macio.Jun कहता है सही है!

हम नीचे दिए गए कोड की तरह है:

String sql = "select id,title,url,singer,view,info from cache where id=" + id; 
    SQLiteDatabase db = getMaintainer().getReadableDatabase(); 
    Cursor query = db.rawQuery(sql, null); 
    query.moveToFirst(); 
    while(query.moveToNext()){ 
     DBMusicData entity = new DBMusicData(); 
     entity.setId(query.getString(query.getColumnIndex(FIELD_ID))); 
     entity.setTitle(query.getString(query.getColumnIndex(FIELD_TITLE))); 
     entity.setSinger(query.getString(query.getColumnIndex(FIELD_SINGER))); 
     entity.setTitlepic(query.getString(query.getColumnIndex(FIELD_PICURL))); 
     entity.setInfoUrl(query.getString(query.getColumnIndex(FIELD_INFO))); 
     entity.setViews(query.getString(query.getColumnIndex(FIELD_VIEW))); 
     Log.w(tag, "cache:"+ entity.toString()); 
    } 
    query.close(); 
    query=null; 
    db.close(); 
    db=null; 

अगर हम कैश तालिका में केवल एक रिकॉर्ड, query.moveToFirst() है, कोई रिकॉर्ड रिटर्न नहीं देगा।

+0

कृपया तार्किक त्रुटि की जांच करें: यदि cursor.moveToNext सत्य देता है, तो आप पहले रिकॉर्ड पर हैं। कॉलिंग moveToNext आपकी पहली पंक्ति को अगली पंक्ति में छोड़ देगा और आपकी पहली पंक्ति कभी भी एक्सेस नहीं की जाएगी। उस चाल को जांचने के बाद टॉफर्स्ट सच हो जाता है, जबकि आपका लूप लूप के बजाए {} जबकि लूप होगा। –

0

moveToFirst() विधि कर्सर को पहली पंक्ति में ले जाती है। यह परीक्षण करने की अनुमति देता है कि क्वेरी ने एक खाली सेट लौटाया है या नहीं। यहाँ इसके कार्यान्वयन का एक नमूना,

if (cursor.getCount() == 0 || !cursor.moveToFirst()) { 

return cursor.getLong(cursor.getColumnIndexOrThrow(ID_COLUMN)); 

cursor.close();