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 désactiver l'envoi de texte logcat dans Eclipse Juno
  • TestUI (Jenkins) à l'aide d'un expresso
  • Fin de l'activité sur le glissement de droite?
  • Comment utiliser Single TextWatcher pour plusieurs EditTexts?
  • Puis-je obtenir des journaux de logcat après le redémarrage du téléphone?
  • L'activité NavigationDrawer est encombrée de rappels de fragments et de logique métier d'application
  •  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?

  • Mise à jour automatique pour les applications Android (privées)
  • Android Google maps API V2 center markers
  • Comment faire pour récupérer la pile pour l'activité avec plusieurs fragments?
  • Comment utiliser "adb ppp"?
  • Mon emplacement actuel renvoie toujours nulle. Comment puis-je réparer cela?
  • Schedulers par défaut pour rxjava sur 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.