Y a-t-il un moyen de raccourcir cette fois-ci? Je cours avec le curseur et prend le nom, les numéros de téléphone et les courriels
Si je supprimai les numéros de téléphone de la requête de la boucle de la requête, il se termine en 3 secondes p>
aucune idée de la question Comment puis-je améliorer cette requête ? p>
Peut-être que je fais quelque chose de mal dans ma requête? P>
(évidemment je le fais comme async mais toujours ... c'est un très long moment qu'un utilisateur ne puisse pas Attendez) P>
J'espère que quelqu'un peut partager ses pensées à propos de cette p>
Ceci est mon code P>
ContentResolver cr = getContentResolver(); Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if (cur.getCount() > 0) { while (cur.moveToNext()) { AddressBookEntity adr = new AddressBookEntity(); String id = cur.getString(cur .getColumnIndex(ContactsContract.Contacts._ID)); String name = cur .getString(cur .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); adr.fullName = name; Cursor emailCur = cr .query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[] { id }, null); while (emailCur.moveToNext()) { // This would allow you get several email addresses // if the email addresses were stored in an array String email = emailCur .getString(emailCur .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); if (!Utils.IsNullOrEmptyString(email)) { adr.email = email; } } emailCur.close(); if (Integer .parseInt(cur.getString(cur .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { Cursor pCur = cr .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id }, null); int phoneIndex = 0; while (pCur.moveToNext()) { String number = pCur.getString(pCur .getColumnIndex(Phone.NUMBER)); String country = Utils.GetCountryFromNumber( number, app); number = Utils.GetFullPhoneNumber(number, app); if (phoneIndex == 0) { if (!Utils.IsNullOrEmptyString(number)) { adr.contactAdressBookId = id; adr.phoneNumber = number; adr.userInsertedId = app.userCred.userId; adr.country = country; myContacts.add(adr); } } else { if (!Utils.IsNullOrEmptyString(number)) { AddressBookEntity adrMore = new AddressBookEntity(); adrMore.fullName = adrMore.fullName; adrMore.country = adrMore.country; adrMore.email = adrMore.email; adrMore.phoneNumber = number; adrMore.contactAdressBookId = id; adrMore.country = country; myContacts.add(adrMore); } } } pCur.close(); } } cur.close();
3 Réponses :
Avec le code suivant pour 59 contacts, j'ai reçu les résultats suivants sur l'émulateur:
class AddressBookContact { private long id; private Resources res; private String name; private LongSparseArray<String> emails; private LongSparseArray<String> phones; AddressBookContact(long id, String name, Resources res) { this.id = id; this.name = name; this.res = res; } @Override public String toString() { return toString(false); } public String toString(boolean rich) { SpannableStringBuilder builder = new SpannableStringBuilder(); if (rich) { builder.append("id: ").append(Long.toString(id)) .append(", name: ").append("\u001b[1m").append(name).append("\u001b[0m"); } else { builder.append(name); } if (phones != null) { builder.append("\n\tphones: "); for (int i = 0; i < phones.size(); i++) { int type = (int) phones.keyAt(i); builder.append(ContactsContract.CommonDataKinds.Phone.getTypeLabel(res, type, "")) .append(": ") .append(phones.valueAt(i)); if (i + 1 < phones.size()) { builder.append(", "); } } } if (emails != null) { builder.append("\n\temails: "); for (int i = 0; i < emails.size(); i++) { int type = (int) emails.keyAt(i); builder.append(ContactsContract.CommonDataKinds.Email.getTypeLabel(res, type, "")) .append(": ") .append(emails.valueAt(i)); if (i + 1 < emails.size()) { builder.append(", "); } } } return builder.toString(); } public void addEmail(int type, String address) { if (emails == null) { emails = new LongSparseArray<String>(); } emails.put(type, address); } public void addPhone(int type, String number) { if (phones == null) { phones = new LongSparseArray<String>(); } phones.put(type, number); } }
Merci beaucoup essayer ça :) Je reviendrais avec mes résultats
et? Quels étaient vos résultats?
Je ne suis pas encore sur un autre projet, je reviendrai pour vérifier cela plus tard, je vous tiendrai au courant :) Et merci encore! de ce que je vois de vous des résultats mes 700 contacts devrait charger en quelques secondes espère que cela sera effectivement le résultat
Oui, je m'intéresse aussi aux résultats, alors s'il vous plaît laissez-moi savoir quand vous le testez ...
Ne vous inquiétez pas, je vais bien! :)
Hey ça marche super !!! 11-11 10: 00: 08.907: D / Tag (32169): ╔══════ Statistiques d'exécution des requêtes ═══════ 11-11 10: 00: 08.907: D / Tag (32169): Got 959 Contacts 11-11 10: 00: 08.917: D / Tag (32169): ║ Requête a pris 1,985 S (1985 MS) 11-11 10: 00: 08.917: D / TAG (32169): ═══════════════════════════════ Merci beaucoup! va l'utiliser :))
HMM, vous devez avoir un périphérique très lent depuis 1985 ms pour 700 contacts est d'~ 3 ms / contact, et mon émulateur a fait 60 contacts dans 12 ms, donc son 0,2 ms / contact ... BTW quel appareil est-il? Aussi, c'est une période moyenne basée sur plusieurs pistes ou juste première exécution?
C'est le résultat de la première course ... Je l'ai exécuté sur Samsung Galaxy 5, je l'intégrais maintenant à mon code, donc je l'exécuterai (peu de sensus) plusieurs fois, vous m'avez vraiment aidé avec ce code merci beaucoup
Bonjour, et quel était le temps moyen dans votre cas?
Ceci est définitivement très rapide et efficace, j'ai un peu de difficulté à déterminer comment obtenir l'adresse / l'emplacement (structurépostal est les commondatakinds). Quelqu'un a des conseils?
@Silmarilos change Sélection code> et
SelectionArgs code> pour ce nouveau
COMMONTAKINDS code>
Bonne réponse et sortie parfaite. J'ai seulement 1 question -> Comment puis-je obtenir uniquement l'adresse e-mail sur listeView click?
@Rushankshah Utilisez adressebookcontact.eMails code> puis
Oui. J'ai utilisé des courriels, mais quand je clique sur l'élément de listeView, puis-je obtenir une adresse email de ce contact (sur Toast).?
@Rushankshah en utilisant adapter.getem () code>?
Oui à l'aide de Adapter.GetTitem () .. J'ai utilisé Public Void OnitemClick (Adapterview > Parent, Affichage de la vue, Position Int, ID long) {String Second = List.Embourez (position). ); } code> mais cela ne me donne que le 1er record de position.
@Rushankshah Si vous cliquez sur le premier élément, la position code> est 0, si vous cliquez sur le second élément, la position
code> est 1 etc
J'ai lier l'adaptateur avec autocompletetextView code>. Donc, chaque fois que je reçois la 0e des données de position.
@Rushankshah Quelle est la valeur de la position code> dans
onItemClick code> méthode?
Il affiche 0 Si je sélectionne le 1er nom, indique le 1er si je sélectionne 2e nom. Mais en réalité, la position de ce nom et de ce courrier électronique est 20e.
Avez-vous essayé cette méthode avec autocompletetextView code>?
@ pskink..Si u ne vous dérange pas pouvez-vous voir cela question ..J'ai des problèmes pour obtenir un email avec le nom et le numéro de téléphone.
@sunily vous avez mon code, alors quel est le problème avec cela?
OUI..MIS, je dois envoyer au serveur PHP.. dans ma question, j'ai expliqué mon problème..Can u s'il vous plaît voir ça ..? Où je vais mal ..?
@Sunily So Itérer sur Liste
pour (adressebookContact item: liste) {... code>
@ pskink.i a mis en œuvre comme votre code..it fonctionne bien.
@pskink Comment obtenir ces valeurs séparément..Je moyenne courriel, numéro, nom dans des chaînes séparées et comment créer une matrice JSON ..?
@pskink Pouvez-vous m'aider à obtenir des journaux d'appels plus rapides et en groupe et de montrer le nombre de séquentiel appelé numéro
@ pskink..Si vous ne vous dérange pas, pouvez-vous voir cela s'il vous plaît voir ceci ( Stackoverflow.com/questions/46219231/... ) question.J'ai des problèmes Dans le chargement du journal des appels plus rapidement
Wow, génial, cela utilise réellement une seule requête, qui garantit une performance maximale. C'est la bonne réponse, je ne peux pas croire comment la plupart des autres réponses utilisent plusieurs requêtes pour un cas simple d'utilisation comme celui-ci ..
@ Markogajić C'est normal, la plupart des utilisateurs utilisent aveuglément ^ C / ^ V sans aucune réflexion de 5 minutes sur la manière dont certaines choses pouvaient être faites mieux - le meilleur exemple est des centaines de messages ici sur la façon de déplacer / échelle / pivoter des images - ils utilisent énormes quantité de code spaghetti alors qu'il peut être fait en utilisant Ceci simple MatrixgesdureTector code>
Essayez ce code, utilisez une dialouge de progression
public void getAllContacts() { new AsyncTask<String, String, ArrayList<UserInfo>>() { ArrayList<UserInfo> infos = new ArrayList<>(); @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected ArrayList<UserInfo> doInBackground(String... params) { ContentResolver contactResolver = context.getContentResolver(); Cursor cursor = contactResolver.query(ContactsContract.Contacts.CONTENT_URI, new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.HAS_PHONE_NUMBER }, null, null, null); if(cursor.getCount()>0) while ( cursor.moveToNext()) { String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); // String photoUri = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI)); String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); // String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); Log.d("TAG", " Name: " + displayName); if (Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { Cursor pCur = contactResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { contactId }, null); while (pCur.moveToNext()) { String phone = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); String type = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)); String s = (String) ContactsContract.CommonDataKinds.Phone.getTypeLabel(context.getResources(), Integer.parseInt(type), ""); Log.d("TAG", s + " phone: " + phone); } pCur.close(); } Cursor emailCursor = contactResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[] { contactId }, null); while (emailCursor.moveToNext()) { String phone = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); int type = emailCursor.getInt(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); String s = (String) ContactsContract.CommonDataKinds.Email.getTypeLabel(context.getResources(), type, ""); Log.d("TAG", s + " email: " + phone); } emailCursor.close(); } cursor.close(); return null; } @Override protected void onPostExecute(ArrayList<UserInfo> aVoid) { super.onPostExecute(aVoid); // EventBus.getDefault().post(aVoid); } }.execute(); }
Vous récupérez toutes les colonnes de votre requête:
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
3 secondes est trop, cela devrait être fait en une demi-seconde dans le pire des cas
Le code ci-joint prend presque une minute! 3 secondes est sans le courrier et les téléphones
oui je sais, 700 articles ne doivent pas prendre plus d'une seconde
Pour le prouver, je vais vous donner la solution de travail demain
OMG j'ai oublié le code principal de ma réponse, essayez-le maintenant et dites vos résultats, je pense que vous devriez le faire en 1/3 sec ...