2011-12-08 11 views
8

Obecnie pracuję z Android Kontakty dostawcy treści i obecnie można uzyskać dostępu do kontaktów pełną nazwę wyświetlaną bez problemu za pomocą następującego kodu:Otrzymasz imię i nazwisko kontaktu zamiast pojedynczej nazwy wyświetlanej?

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); 

Jednakże chcę, aby być w stanie uzyskać zarówno kontakty imię i nazwisko oddzielnie, próbowałem użyć StructuredName w próbie uzyskania tego, ale nie mogę sprawić, żeby działało.

Czy ktoś może wskazać mi właściwy kierunek, w jaki sposób poprawnie używać nazwy StructuredName, aby uzyskać podział nazwy na Pierwszy i Ostatni?

UPDATE:

Po porady hovanessyan za próbowałem następujące:

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); 
    } 

Jednak używając projekcji powoduje zawieszenie się następująco:

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

Jeśli usunąć projekcji Otrzymuję wszystkie wyniki wydrukowane, ale wiele z nich zawiera NULL.

Na przykład:

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 

więc każdy może zobaczyć, co robię źle, że moja projekcja nie działa?

INNE AKTUALIZACJA:

mam załatwione problemy z moim WYSTAJĄCEJ ale teraz mam problem, gdy dostawca treści danych jest dostarczanie mnie z powrotem ze wszystkimi danymi nieważna i powoduje NULL wyjątków wskaźnik w moim kodu .

Liczba kursorów z ContactsContract.Contacts zwraca mi 115 na przykład, ale użycie tabeli DATA daje mi powrót 464 przy użyciu tych samych parametrów, co powoduje ogromne problemy w mojej aplikacji.

Ktoś ma jakieś pomysły, dlaczego tak jest?

Odpowiedz

13

Zobacz klasę ContactsContract.CommonDataKinds.StructuredName. Masz wszystkie potrzebne kolumny tam, i prawdopodobnie można zrobić coś takiego:

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

To musi być zrobione w przypadku FilterQuery, który wydaje się być przyczyną problemu, potrzebuję móc uzyskać kolumny ID, DisplayName i HasPhoneNumber, w których moje ograniczenie String jest równe nazwie Given lub Family. Więc potrzebuję managedQuery i wydaje się, że przedstawia pewne problemy. –

+0

Musisz użyć ogólnej tabeli Dane, aby to osiągnąć: http://developer.android.com/reference/android/provider/ContactsContract.Data.html – hovanessyan

+0

Podjęto próbę uzyskania informacji przy użyciu ogólnej tabeli danych i natknąłem się na pewne problemy, zredagowałem moje pytanie na wypadek, gdybyś mógł pomóc dalej, dzięki. –

2

Oto ogólna funkcja pobierania danych użytkownika z ContactsContract.Data tabeli:

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(); 
Powiązane problemy