2012-04-10 15 views
7

मैं एक तालिका में सभी कॉलम को एक लंबे टेक्स्ट व्यू और/या स्ट्रिंग में पूछने का प्रयास कर रहा हूं। मुझे पता है कि यह चीजों को करने का सही तरीका नहीं हो सकता है लेकिन मुझे यह करना है। मुझे सही अगर मैं गलत हूँ, मैं धारणा है कि अगले ले जाने पंक्ति में अगले कॉलम मिलेगा तहत किया गया था:एंड्रॉइड कर्सर। MoveToNext()?

Cursor c = db.get(); 
if(c.moveToFirst){ 
do{ 
string = c.getString(0); 
}while(c.moveToNext); 

मैंने सोचा था कि यह पहले कॉलम हो और उसकी सारी सामग्री को प्रदर्शित करने के बजाय मैं मिलेगा पहला कॉलम और पहली पंक्ति। मैं क्या गलत कर रहा हूं? क्या ListView का उपयोग किये बिना इस जानकारी को प्राप्त करने का कोई बेहतर या वास्तविक तरीका है?

उत्तर

9

स्पष्टता के लिए एक पूर्ण उदाहरण निम्नानुसार होगा जिस पर मेरा विश्वास है। कोड टिप्पणियों के संकेत के रूप में हम डेटाबेस पंक्तियों के अनुसार अनिवार्य रूप से डेटा पंक्तियों और डेटाबेस के अनुसार डेटा की एक तालिका बनाने के लिए फिर से सक्रिय करते हैं।

Cursor cursor = getActivity().getContentResolver().query(uri, projection, null, null, 
      null); 

    //if the cursor isnt null we will essentially iterate over rows and then columns 
    //to form a table of data as per database. 
    if (cursor != null) { 

     //more to the first row 
     cursor.moveToFirst(); 

     //iterate over rows 
     for (int i = 0; i < cursor.getCount(); i++) { 

      //iterate over the columns 
      for(int j = 0; j < cursor.getColumnNames().length; j++){ 

       //append the column value to the string builder and delimit by a pipe symbol 
       stringBuilder.append(cursor.getString(j) + "|"); 
      } 
      //add a new line carriage return 
      stringBuilder.append("\n"); 

      //move to the next row 
      cursor.moveToNext(); 
     } 
     //close the cursor 
     cursor.close(); 
    } 
1

moveToNext कर्सर को अगली पंक्ति में ले जाएं। और c.getString (0) आपको हमेशा पहला कॉलम देगा यदि कोई है। मुझे लगता है कि आप अपने पाश

int index = c.getColumnIndex("Column_Name"); 
string = c.getString(index); 
1

cursor.moveToFirst() पहली पंक्ति के लिए कर्सर ले जाता है के अंदर इस के समान कुछ करना चाहिए। यदि आप जानते हैं कि आपके पास 6 कॉलम हैं, और आप सभी कॉलम वाले एक स्ट्रिंग चाहते हैं, तो निम्न का प्रयास करें।

c.moveToFirst(); 
StringBuilder stringBuilder = new StringBuilder(); 
for(int i = 0; i < 6; i++){ 
    stringBuilder.append(c.getString(i)); 
} 

// to return the string, you would do stringBuilder.toString(); 
+1

और यदि आप कॉलम की संख्या नहीं जानते हैं, तो 'for' loop में 'c.getColumnCount() 'का उपयोग करें। – Squonk

0

मैं इस तरह cusror पर मेरे छोरों कोडिंग कर रहा हूँ:

cursor.moveToFirst(); 
    while(!cursor.isAfterLast()) { 

      cursor.getString(cursor.getColumnIndex("column_name")); 

     cursor.moveToNext(); 
    } 

हमेशा काम करता है। यह सभी पंक्तियों के कॉलम "कॉलम_नाम" के मानों को पुनर्प्राप्त करेगा। आपकी गलती यह है कि आप पंक्तियों पर लूप करते हैं और कॉलम नहीं। स्तंभों पर पाश करने के लिए:

cursor.moveToFirst();  
    for(int i = 0; i < cursor.getColumnNames().length; i++){ 
     cursor.getString(i); 
    } 

कि पहली पंक्ति के स्तंभों पर पाश और प्रत्येक स्तंभ मान प्राप्त होगा।

30

सरल इस्तेमाल होता है:

Cursor cursor = db.query(...); 
while (cursor.moveToNext()) { 
    ... 
} 

moveToFirst प्रयोग किया जाता है जब आप शुरू से ही दोहराने के बाद आप पहले से ही कुछ स्थिति तक पहुँच चुके हैं शुरू करने के लिए की जरूरत है।

कर्सर.getCount() का उपयोग करने से बचें यदि यह आवश्यक है। और getCount() पर लूप का कभी भी उपयोग न करें।

getCount महंगा है - यह उन्हें गिनने के लिए कई रिकॉर्डों पर पुनरावृत्त करता है। यह एक संग्रहित चर वापस नहीं करता है। दूसरी कॉल पर कुछ कैशिंग हो सकती है, लेकिन पहली कॉल को तब तक जवाब नहीं पता जब तक कि इसकी गणना नहीं की जाती।

यदि आपकी क्वेरी 1000 पंक्तियों से मेल खाती है, तो कर्सर में वास्तव में केवल पहली पंक्ति होती है। प्रत्येक moveToNext खोज करता है और अगला मैच पाता है। GetCount को सभी 1000 मिलना चाहिए। अगर आपको केवल 10 की आवश्यकता है तो सभी को फिर से क्यों करें? दो बार फिर से क्यों?

इसके अलावा, यदि आपकी क्वेरी इंडेक्स का उपयोग नहीं करती है, तो GetCount भी धीमा हो सकता है - GetCount 10000 से अधिक रिकॉर्ड हो सकता है भले ही क्वेरी केवल 100 से मेल खाती हो। क्यों 10000 के बजाय 20000 लूप?

+1

एंड्रॉइड 4.2 के रूप में, 'moveToNext() 'को' moveToPosition() 'द्वारा कार्यान्वित किया गया है जो [खुद को' .getCount()'] (http: // androidxref भी कहते हैं।com/4.2.2_r1/xref/चौखटे/आधार/कोर/जावा/एंड्रॉयड/डेटाबेस/AbstractCursor.java # moveToPosition)। निश्चित रूप से यह केवल कार्यान्वयन विवरण है जिस पर भरोसा नहीं किया जाना चाहिए। – kennytm

+1

@ केनीटीएम सही है। असल में यह एंड्रॉइड 4.2 से पहले भी मामला था (http://bit.ly/1s8KClM देखें)। इसके अलावा, 'moveToNext()' के अलावा अन्य सभी मूल कर्सर संचालन (जैसे 'moveToFirst() ',' पहले से पहले()' और 'पहले सबसे पहले() ') को' getCount()' में कॉल शामिल है। तो अगर 'getCount()' महंगा है तो यह अपरिहार्य है। इसके अलावा, 'getCount()' के कार्यान्वयन के मूल्य लौटाए गए मूल्य, इसलिए कम से कम बाद की कॉल सस्ता हो जाएगी (http://bit.ly/1uL4ZEp देखें)। – Matthias

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