2011-12-08 45 views
8

Actualmente estoy trabajando con el proveedor de contenido de Android Contactos y en la actualidad se puede acceder a un contacto nombre de visualización completa sin ningún problema usando el siguiente código:¿Obtener el nombre y el apellido de un contacto en lugar del nombre único para mostrar?

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

Sin embargo, quiero ser capaz de obtener tanto los contactos de nombre y apellido por separado, he tratado de usar el StructuredName en un intento de obtener esto, pero parece que no puedo hacerlo funcionar.

¿Alguien puede indicarme en la dirección correcta cómo usar StructuredName correctamente para dividir el nombre en Primero y Último?

ACTUALIZACIÓN:

Siguiendo el consejo de hovanessyan He intentado lo siguiente:

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

Sin embargo, utilizando la proyección hace que un accidente de la siguiente manera:

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

Si quito la proyección Obtengo todos los resultados impresos, pero muchos de ellos contienen NULL.

Por ejemplo:

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 

Entonces, ¿puede alguien ver lo que estoy haciendo mal en mi proyección que no funciona?

ADEMÁS DE ACTUALIZACIÓN:

me han solucionado los problemas con mi proyección, pero ahora tengo un problema donde el proveedor de contenido de datos mí es el suministro de vuelta con todos los datos nulos y causando excepciones de puntero nulo en mi código .

Un recuento de cursores de ContactsContract.Contacts me devuelve 115 por ejemplo, pero el uso de la tabla DATA me devuelve 464 utilizando los mismos parámetros y esto está causando grandes problemas en mi aplicación.

¿Alguien tiene alguna idea de por qué es así?

Respuesta

13

Echa un vistazo a la clase ContactsContract.CommonDataKinds.StructuredName. Usted tiene todas las columnas necesarias allí, y es probable que pueda hacer algo como:

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

que tiene que ser hecho dentro de un FilterQuery que parece estar causando el problema, necesito poder obtener las columnas ID, DisplayName y HasPhoneNumber donde mi restricción String es igual al nombre dado o al apellido. Entonces necesito una ManageQuery y esto parece estar presentando algunos problemas. –

+0

Tiene que usar los datos de la tabla genérica para lograr esto: http://developer.android.com/reference/android/provider/ContactsContract.Data.html – hovanessyan

+0

He intentado obtener la información usando la tabla de datos genéricos y he encontrado algunos problemas, he editado mi pregunta en caso de que puedas ayudar más, gracias. –

2

Aquí es una función general para la obtención de datos de usuario desde ContactsContract.Data tabla:

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(); 
Cuestiones relacionadas