2011-12-08 12 views
8

मैं वर्तमान में Android संपर्क सामग्री प्रदाता के साथ काम कर रहा हूँ और वर्तमान में इस मुद्दे के बिना एक संपर्क पूर्ण प्रदर्शन नाम का उपयोग कर सकते निम्नलिखित कोड का उपयोग कर:एकल प्रदर्शन नाम के बजाय संपर्क का पहला और अंतिम नाम प्राप्त करें?

String[] PROJECTION = new String[] { 
     ContactsContract.Contacts._ID, 
     ContactsContract.Contacts.DISPLAY_NAME, 
     ContactsContract.Contacts.HAS_PHONE_NUMBER, 
     }; 
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 

String SELECTION = "LOWER(" + ContactsContract.Contacts.DISPLAY_NAME + ")" 
    + " LIKE '" + constraint + "%' " + "and " + 
     ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '1'"; 

Cursor cur = managedQuery(ContactsContract.Contacts.CONTENT_URI, 
       PROJECTION, SELECTION, null, sortOrder); 

हालांकि मैं प्रथम और अंतिम नाम दोनों संपर्कों को प्राप्त करने में सक्षम होना चाहते अलग-अलग, मैंने इसे प्राप्त करने के प्रयास में संरचित नाम का उपयोग करने का प्रयास किया है, लेकिन मुझे यह काम नहीं लग रहा है।

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

अद्यतन:

12-08 16:52:01.575: E/AndroidRuntime(7912): Caused by: java.lang.IllegalArgumentException: Invalid column has_phone_number 

अगर मैं अनुमान निकालें:

String[] PROJECTION = new String[] { 
      ContactsContract.Data._ID, 
      ContactsContract.Data.DISPLAY_NAME, 
      ContactsContract.Data.HAS_PHONE_NUMBER, 
    }; 

    String SELECTION = ContactsContract.CommonDataKinds.StructuredName.IN_VISIBLE_GROUP + " = '1'"; 

    String sortOrder = ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 

    Cursor cursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, PROJECTION, SELECTION, null, sortOrder); 

    int indexGivenName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME); 
    int indexFamilyName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME); 
    int indexDisplayName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME); 

    while (cursor.moveToNext()) { 
     String given = cursor.getString(indexGivenName); 
     String family = cursor.getString(indexFamilyName); 
     String display = cursor.getString(indexDisplayName); 
     Log.e("XXX", "Name: | " + given + " | " + family + " | " + display); 
    } 

हालांकि अनुमान का उपयोग कर के रूप में निम्नानुसार एक दुर्घटना का कारण बनता है:

मैं निम्नलिखित का प्रयास किया है hovanessyan की सलाह के बाद मुझे सभी परिणामों को मुद्रित किया जाता है लेकिन उनमें से बहुत से न्यूल होते हैं।

उदाहरण के लिए:

12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null 
12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null 
12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null 
12-08 16:56:14.055: E/XXX(8155): Name: | null | null | null 

तो किसी को क्या मैं में है कि मेरे अनुमान से काम नहीं करता गलत कर रहा हूँ देख सकते हैं?

आगे अद्यतन:

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

संपर्कों से एक कर्सर गिनती। संपर्क मुझे उदाहरण के लिए 115 वापस देता है लेकिन डेटा तालिका का उपयोग करके मुझे उसी पैरामीटर का उपयोग करके 464 वापस देता है और इससे मेरे ऐप में बड़ी समस्याएं आ रही हैं।

किसी के पास कोई विचार है कि ऐसा क्यों है?

उत्तर

13

ContactsContract.CommonDataKinds.StructuredName कक्षा पर एक नज़र डालें। आप सभी की जरूरत कॉलम वहाँ है, और आप शायद की तरह कुछ कर सकते हैं:

Cursor cursor = contentResolver.query(ContactsContract.Data.CONTENT_URI, other_query_params_for_filtering); 

int indexGivenName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME); 
int indexFamilyName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME); 
int indexDisplayName = cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME); 

while (cursor.moveToNext()) { 
    String given = cursor.getString(indexGivenName); 
    String family = cursor.getString(indexFamilyName); 
    String display = cursor.getString(indexDisplayName); 
} 
+0

यह किया जा सकता है एक फ़िल्टरQuery के भीतर जो समस्या उत्पन्न कर रहा है, मुझे आईडी, डिस्प्लेनाम और हैसफोन नंबर कॉलम प्राप्त करने में सक्षम होना चाहिए, जहां मेरी स्ट्रिंग बाधा या तो दिए गए या पारिवारिक नाम के बराबर है। इसलिए मुझे एक प्रबंधितQuery की आवश्यकता है और ऐसा लगता है कि कुछ समस्याएं पेश हो रही हैं। –

+0

इसे प्राप्त करने के लिए आपको सामान्य तालिका डेटा का उपयोग करना होगा: http://developer.android.com/reference/android/provider/ContactsContract.Data.html – hovanessyan

+0

मैंने जेनेरिक डेटा तालिका का उपयोग करके जानकारी प्राप्त करने का प्रयास किया है और कुछ मुद्दों पर आ गए हैं, अगर आप आगे की मदद कर सकते हैं, तो मैंने अपना प्रश्न संपादित कर लिया है। –

2

यहाँ ContactsContract.Data तालिका से उपयोगकर्ता डेटा प्राप्त करने के लिए एक सामान्य समारोह है:

Map<String, String> result = new HashMap<>(); 
Cursor cursor = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, ContactsContract.Data.CONTACT_ID + "='" + YOUR_CONTACT_ID + "'", null, null); 
if (cursor != null) { 
    while (cursor.moveToNext()) { 
     String mime = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.MIMETYPE)); 
     switch (mime) { 
      case ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE: 
       result.put(FIRST_NAME, cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME))); 
       result.put(LAST_NAME, cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME))); 
       break; 
      case ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE: 
       result.put(CITY, cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY))); 
       result.put(STREET, cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET))); 
       result.put(ZIP, cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE))); 
       break; 
      case ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE: 
       if (ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE == cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE))) { 
        result.put(MOBILE, cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); 
       } 
       break; 
     } 
    } 
    cursor.close(); 
} 
return result; 
2
 Cursor phone_cursor = cr.query(ContactsContract.CommonDataKinds. 
       Phone.CONTENT_URI, null, null, null, null); 
     while (phone_cursor.moveToNext()) { 
      try { 
      int id = Integer.parseInt(phone_cursor.getString(phone_cursor.getColumnIndex 
        (ContactsContract.CommonDataKinds.Phone.CONTACT_ID))); 
      Cursor name_cursor = cr.query(ContactsContract.Data.CONTENT_URI,null, 
        ContactsContract.Data.CONTACT_ID + " = " + id, null, null); 

       String name = phone_cursor.getString(phone_cursor.getColumnIndex 
         (ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
       String first_name =""; 
       String last_name = ""; 
       while (name_cursor.moveToNext()) { 
        if(name_cursor.getString(name_cursor.getColumnIndex 
          (ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME))!=null){ 
        first_name = name_cursor.getString(name_cursor.getColumnIndex 
          (ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME)); 
        last_name = name_cursor.getString(name_cursor.getColumnIndex 
          (ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME)); 
       }} 
       name_cursor.close(); 
       String phoneNumber = phone_cursor.getString(phone_cursor.getColumnIndex 
         (ContactsContract.CommonDataKinds.Phone.NUMBER)); 
      } catch (Exception e) { 
      } 
     } 
     phone_cursor.close(); 
संबंधित मुद्दे

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