Contacts Android Affichage Nom et Numéro de Téléphone(s) en simple requête de base de données?
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 une surcharge considérable.
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.
Vous devez vous connecter pour publier un commentaire.
Essayez ce code:
Les contacts de l'API est extrêmement délicate et a plusieurs implicite rejoint.
Lire la ContactContract et ContactsProvider2 si vous pouvez vous permettre le temps.
Que voulez-vous? Les tables sont enchaînés comme ceci:
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.
Les numéros de téléphone sont stockés dans leur propre table, et doivent être interrogés séparément. Pour interroger le numéro de téléphone de l'utilisation de la table de l'URI stockées dans le SDK variable ContactsContract.CommonDataKinds.Téléphone.CONTENT_URI. Utiliser un OÙ conditionnelle pour obtenir les numéros de téléphone pour le contact.
Effectuer une deuxième requête contre les contacts Android de base de données SQLite. Les numéros de téléphone sont interrogés à l'encontre de l'URI stockées dans ContactsContract.CommonDataKinds.Téléphone.CONTENT_URI. Le contact ID est stocké dans le téléphone de table comme ContactsContract.CommonDataKinds.Téléphone.CONTACT_ID et la clause where est utilisée pour limiter les données renvoyées.