2013-02-21 14 views
18

जब मैं फोन की संपर्क सूची से फोन नंबर प्राप्त करने का प्रयास कर रहा हूं। समस्या यह है कि, जब मैं ऐप चला रहा हूं, जबकि फोन में संपर्क सूची खाली है, ऐप बंद कर दिया गया है। मैंने इसे चेक किया और ऐसा इसलिए है क्योंकि कर्सर खाली है।यह जांचने के लिए कि कोई कर्सर खाली है या नहीं?

मैं कैसे जांच सकता हूं कि कर्सर खाली है या फोन की संपर्क सूची में कोई संपर्क है या नहीं?

ArrayList<String> lstPhoneNumber = new ArrayList<String>(); 
Cursor phones = getContentResolver().query(
     ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null); 
lstPhoneNumber = new ArrayList<String>(); 

phones.moveToFirst(); 
// The problematic Line: 
lstPhoneNumber.add(phones.getString(phones.getColumnIndex(
     ContactsContract.CommonDataKinds.Phone.NUMBER))); 
while (phones.moveToNext()) { 
    lstPhoneNumber.add(phones.getString(phones.getColumnIndex(
      ContactsContract.CommonDataKinds.Phone.NUMBER))); 
} 
phones.close(); 
+0

फोन से छुटकारा पाएं। MoveToFirst() और 1stPhonenumber.add कॉल .. अपना समय लूप छोड़ दें। तय की। – dymmeh

+0

इसके अलावा, उन स्तंभों के प्रक्षेपण में गुज़रने का प्रयास करें जिनके लिए आप पूछ रहे हैं। जब आपको केवल 1. – dymmeh

उत्तर

8

मैंने एक प्रक्षेपण में जोड़ा ताकि आपको केवल कॉलम प्राप्त हो रहा हो।

String[] projection = new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER }; 
ArrayList<String> lstPhoneNumber = new ArrayList<String>(); 
Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
     projection, null, null, null); 
if (phones == null) 
    return; // can't do anything with a null cursor. 
try { 
    while (phones.moveToNext()) { 
     lstPhoneNumber.add(phones.getString(0)); 
    } 
} finally { 
    phones.close(); 
} 
+0

जोड़ता है तो यह अतिरिक्त अक्षर जोड़ता है। :) –

+0

ओह हाहा .. मैं पढ़ नहीं सकता :) – dymmeh

+0

धन्यवाद यह पूरी तरह से काम किया! –

21

cursor.getCount() == 0 का उपयोग करें। यदि सही है, तो कर्सर खाली है

4

इसे आजमाएं। आपके कोड की समस्या यह है कि कर्सर की लंबाई के बावजूद यह निष्पादित करेगा। मैं फोन कथन में फोन करता हूं। MoveToFirst() अगर कर्सर खाली है या कोई रिकॉर्ड सेट नहीं है तो यह झूठी वापसी करेगा।

if(phones.moveToFirst()){ 
     do{ 
      lstPhoneNumber.add(phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); 
     }while(phones.moveToNext()) 
    } else { 
     //do something else 
    } 
+0

की आवश्यकता होती है तो केवल सभी कॉलम (प्रक्षेपण के लिए शून्य में गुजरकर) को पुनर्प्राप्त करने का कोई उपयोग नहीं होता है या बस थोड़ी देर लूप करें .. अगर अतिरिक्त/जोड़ते हुए बदसूरत दिखता है और पॉइंटलेस लॉजिक – dymmeh

29

सामान्य पद्धति एक "वैध" कर्सर के लिए परीक्षण करने के लिए

((cursor != null) && (cursor.getCount() > 0)) 

संपर्क प्रदाता लौट अशक्त नहीं करता है, लेकिन अन्य सामग्री प्रदाताओं ऐसा हो सकता है अगर वे डेटा त्रुटि के कुछ प्रकार का सामना । एक सामग्री प्रदाता अपवादों को संभालना चाहिए, कर्सर को शून्य पर सेट करें, और अपवाद लॉग करें, लेकिन इसकी कोई गारंटी नहीं है।

4
public boolean isCursorEmpty(Cursor cursor){ 
    return !cursor.moveToFirst() || cursor.getCount() == 0; 
} 
1
cursor.moveToFirst(); 
if (cursor.isBeforeFirst()) //means empty result set 
     ; //do your stuff when cursor is empty 

isBeforeFirst() एक moveToFirst() अच्छी तरह से भी काम करता है के बाद।

Cursor documentation के अनुसार:

isBeforeFirst(): रिटर्न कि क्या कर्सर पहली पंक्ति से पहले स्थिति की ओर इशारा करते है।

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