Android n'utilise un curseur qu'avec des contacts contenant un courriel listé> Android 2.0

J'ai le code suivant pour obtenir des contacts du content provider

 String[] columns = new String[] { ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts._ID, ContactsContract.Contacts.PHOTO_ID }; Cursor cursor = managedQuery(ContactsContract.Contacts.CONTENT_URI, columns, null, null, null); 

Et j'utilise celui-ci pour obtenir les courriels pour un contact spécifique par leur identifiant:

  • Comment effacer le focus pour EditText?
  • RunOnUiThread dans le fragment
  • Fragments et changement d'orientation
  • Mode hors-ligne pour l'application Android utilisant google maps api
  • Comment puis-je contrôler la vitesse de défilement de recyclerView.smoothScrollToPosition (position)
  • Application de radio FM pour Android
  •  Cursor emails = getContentResolver().query( ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contact.getContactId(), null, null); 

    Ma mise en œuvre actuelle passe chaque ligne dans le curseur et acquiert ses courriels et les stocke dans une liste d'objets java.

    Ce que je me demandais s'il était possible de faire, c'est simplement interroger le fournisseur de contenu et renvoyer un curseur de contacts juste avec des identifiants / noms, etc. qui ont une adresse de messagerie indiquée.

    Cette façon a une longue période d'attente pour obtenir la liste des contacts. J'utilise cette liste pour un adaptateur de liste. Si je peux obtenir uniquement les contacts qui ont un courrier électronique, je peux utiliser un adaptateur de curseur dans ma liste.

    Est-ce possible comme cela? Comment puis-je accélérer le processus?

  • Gradle - compilation du module sélectif (réutilisation du pot autrement)
  • Téléchargement d'un fichier étendu en plusieurs parties en utilisant OkHttp
  • Utilisation de COLLATE dans Android SQLite - Locales est ignoré dans la déclaration LIKE
  • Comment annuler la sélection de texte par défaut de l'application Android Web 4.1 OS?
  • Comment implémenter 2 différents types de séparateurs (c.-à-d. Les en-têtes) dans une classe Adaptateur ListView
  • Application ping dans Android
  • 2 Solutions collect form web for “Android n'utilise un curseur qu'avec des contacts contenant un courriel listé> Android 2.0”

    @CapDroid

    Correction du code de travail de la publication de DArkO:

      ContentResolver cr = context.getContentResolver(); String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.PHOTO_ID, ContactsContract.CommonDataKinds.Email.DATA, ContactsContract.CommonDataKinds.Photo.CONTACT_ID }; String order = "CASE WHEN " + ContactsContract.Contacts.DISPLAY_NAME + " NOT LIKE '%@%' THEN 1 ELSE 2 END, " + ContactsContract.Contacts.DISPLAY_NAME + ", " + ContactsContract.CommonDataKinds.Email.DATA + " COLLATE NOCASE"; String filter = ContactsContract.CommonDataKinds.Email.DATA + " NOT LIKE ''"; Cursor cur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, filter, null, order); 

    Votre curseur aura des identifiants essentiels ainsi que des noms et des adresses de courrier électronique. La performance de ce code est excellente car elle demande seulement quelques colonnes.

    J'ai résolu celui-ci, voilà comment il est terminé:

    METTRE À JOUR

      String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.PHOTO_ID, Email.DATA, ContactsContract.CommonDataKinds.Photo.CONTACT_ID }; String order = " CASE WHEN " + ContactsContract.Contacts.DISPLAY_NAME + " NOT LIKE '%@%' THEN 1" + " ELSE 2 END, " + ContactsContract.Contacts.DISPLAY_NAME + " COLLATE NOCASE"; String filter = Email.DATA + " NOT LIKE '' ) GROUP BY ( " + Email.DATA; return mContent.query(Email.CONTENT_URI, PROJECTION, filter, null, order); 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.