49 votes

Contacts Android Nom affiché et numéro (s) de téléphone dans une requête de base de données unique?

Je suis en train d'essayer d'obtenir une liste de contacts à partir de la base de données native avec leur Nom complet et Numéro de Téléphone de l'une ou de la totalité). Il existe de nombreuses méthodes pour obtenir cette information avec plusieurs requêtes sur le téléphone de base de données, mais cela introduit considérable des frais généraux.

Voici la requête que j'ai travaillé, mais il en résulte

Uri uri                = ContactsContract.Contacts.CONTENT_URI;
String[] projection    = new String[] { ContactsContract.Contacts._ID,
                                        ContactsContract.Contacts.DISPLAY_NAME,
                                        ContactsContract.CommonDataKinds.Phone.NUMBER};
String selection       = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '1'";
String[] selectionArgs = null;
String sortOrder       = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";

Cursor people          = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);

int index_id    = people.getColumnIndex(ContactsContract.Contacts._ID);
int indexName   = people.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
int indexNumber = people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);

people.moveToFirst();
do {
    String _id    = people.getString(index_id);
    String name   = people.getString(indexName);
    String number = people.getString(indexNumber);
    // Do work...
} while (people.moveToNext());

Et voici l'erreur qui en résulte.

E/AndroidRuntime(21549): Caused by: java.lang.IllegalArgumentException: Invalid column data1
E/AndroidRuntime(21549):    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:144)
E/AndroidRuntime(21549):    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)
E/AndroidRuntime(21549):    at android.content.ContentProviderProxy.bulkQueryInternal(ContentProviderNative.java:372)
E/AndroidRuntime(21549):    at android.content.ContentProviderProxy.query(ContentProviderNative.java:408)
E/AndroidRuntime(21549):    at android.content.ContentResolver.query(ContentResolver.java:264)

Pensées? Je crois qu'une jointure peut être nécessaire pour obtenir toutes les colonnes en une seule requête.

104voto

jamapag Points 5803

Essayez ce code:

 Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String[] projection    = new String[] {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                ContactsContract.CommonDataKinds.Phone.NUMBER};

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

int indexName = people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
int indexNumber = people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);

people.moveToFirst();
do {
    String name   = people.getString(indexName);
    String number = people.getString(indexNumber);
    // Do work...
} while (people.moveToNext());
 

14voto

treffer Points 614

Les contacts de l'API est extrêmement délicate et a plusieurs jointures implicites.

Lire la ContactContract et ContactsProvider2 si vous pouvez vous permettre le temps.

Que voulez-vous? Les tables sont enchaînés comme ceci:

  • Contact 1--* Raw Contact
  • Raw Contact 1--* Numéro de Téléphone (tableau de données)

L'API fonctionne comme ceci: vous sélectionnez le bas de l'élément (un numéro de téléphone) et de la jointure implicite de l'élément supérieur (contact).

Vous souhaitez utiliser le TÉLÉPHONE URI cas (ContactsProvider2 / ligne 4377). Cela doit sélectionner tous les numéros de téléphone et de se joindre à la contacter.

Combiner le TÉLÉPHONE uri avec une INTERFACE utilisateur de la magie (pour le groupement), demander à l'DISPLAY_NAME et le numéro de TÉLÉPHONE (DATA1?) et vous devriez être en mesure de résoudre le problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X