Comment rechercher des contacts avec une adresse (FORMATTED_ADDRESS) avec une requête?

J'essaie de mettre en œuvre une recherche en direct sur les contacts des utilisateurs, et je souhaite obtenir le nom, la vignette et l'adresse (s'il y en a un) de chaque contact correspondant.

La recherche en direct s'exécute alors que l'utilisateur tape.

  • Livres sur la conception de l'interface utilisateur Android
  • Comment faire défiler une page Web vers le bas
  • Quels formats audio sont pris en charge par le navigateur Android?
  • Faire apparaître l'application ionique dans la liste "Partager" et recevoir les données
  • SwipeRefreshLayout de support21 force à l'ancien style
  • Chargement par défaut d'images dans ListView
  • Alors il tape ma et obtiendra 'martin', 'matthews' …

    Il continuera avec le tapis et ne verra plus que 'matthews'

    J'essaie d'y parvenir avec une seule requête comme celle-ci, mais j'obtiens toujours le numéro de contact dans le champ FORMATTED_ADRESS . Je suppose que j'ai un problème JOIN , car j'utilise ContactsContract.CommonDataKinds et ContactsContract.Contacts dans la même requête?

     public static List<ContactModel> getContactsForQuery(Context context, String query) { String[] projection = new String[] { ContactsContract.Contacts.DISPLAY_NAME, Contacts.PHOTO_THUMBNAIL_URI, ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS }; Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; String selection = ContactsContract.Contacts.DISPLAY_NAME + " LIKE '%" + query + "%'"; Cursor cursor = context.getContentResolver().query(uri, projection, selection, null,null); if (cursor.moveToFirst()) { do { String name = cursor.getString(0); String thumbail = cursor.getString(1); String formattedADress = cursor.getString(2); } while (cursor.moveToNext()); } 

    J'ai effectivement résolu mon problème avec

    1. En consultant Contacts._ID , Contacts.DISPLAY_NAME
    2. Lancez une deuxième requête avec les Contacts._ID comme suit

       Cursor detailCursor = context.getContentResolver().query( ContactsContract.Data.CONTENT_URI, new String[]{ CommonDataKinds.StructuredPostal.STREET, CommonDataKinds.StructuredPostal.CITY, CommonDataKinds.StructuredPostal.POSTCODE }, ContactsContract.Data.CONTACT_ID + "=? AND " + CommonDataKinds.StructuredPostal.MIMETYPE + "=?", new String[]{ String.valueOf(contactID), CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE }, null); 

    Mais cela va commencer une deuxième requête pour chaque contact , ce qui pourrait ne pas être la meilleure approche.

    Donc, ma dernière question est: est-il possible d'obtenir ce travail avec la première requête?

  • Clé API API Messaging Firebase
  • Barre de défilement personnalisée Android
  • Répliquez Google Maps Bottom Panel Swipe Up
  • Erreur avec google_play_services_version value from aar library
  • Demande simultanée HttpClient utilisant plusieurs AsyncTasks
  • GreenDao freemaker.jar est absent
  • One Solution collect form web for “Comment rechercher des contacts avec une adresse (FORMATTED_ADDRESS) avec une requête?”

    Mmmh, très triste, que personne ne pouvait répondre à ma question et prendre les points de générosité ;-(

    Pour mémoire, voici mon exemple de travail. Il résout le problème mais je pense toujours qu'il produit une grande surcharge. Sur chaque entrée utilisateur ( afterTextchange ), j'appelle getContactsDetailsQuery qui obtient d'abord tous les utilisateurs avec leur ID contenant la requête dans leur nom ( cursor ) et ensuite je lance une autre requête ( detailCursor ) pour chaque utilisateur pour obtenir l'adresse. Pour éviter la surcharge, j'ai ajouté une limite …

     public static List<SearchModel> getContactDetailsForQuery(Context context, String query, int limit) { final int CONTACT_ID_INDEX = 0; final int CONTACT_NAME_INDEX = 1; final int CONTACT_THUMBNAIL_INDEX = 2; //my custom model to hold my results List<SearchModel> results = new ArrayList<SearchModel>(); final String[] selectUser = new String[]{ Contacts._ID, Contacts.DISPLAY_NAME, Contacts.PHOTO_THUMBNAIL_URI}; String selection = Contacts.DISPLAY_NAME + " LIKE ?"; String[] selectionArgs = new String[]{"%" + query + "%"}; String sortOrder = Contacts.DISPLAY_NAME + " ASC"; Cursor cursor = context.getContentResolver().query(Contacts.CONTENT_URI, selectUser, selection, selectionArgs, sortOrder, null); int contactCounter = 0; if (cursor != null && cursor.moveToFirst()) { do { String contactID = cursor.getString(CONTACT_ID_INDEX); String displayName = cursor.getString(CONTACT_NAME_INDEX); String thumbnail = cursor.getString(CONTACT_THUMBNAIL_INDEX); //get user details with user id (this is the query i wanted to change in my question!!) Cursor detailCursor = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI, new String[]{ CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS}, ContactsContract.Data.CONTACT_ID + "=? AND " + CommonDataKinds.StructuredPostal.MIMETYPE + "=?", new String[]{String.valueOf(contactID), CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE}, null); if (detailCursor != null && detailCursor.moveToFirst()) { //special case: user has several address, query all of them do { String formattedAddress = detailCursor.getString(detailCursor.getColumnIndex(CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS)); //user has serveral adress -> init model for each adress SearchModel contact = new SearchModel(); results.add(contact); contactCounter++; } while (detailCursor.moveToNext() && contactCounter < limit); } else { //user has no adress -> init model SearchModel contact = new SearchModel(); results.add(contact); contactCounter++; } detailCursor.close(); } while (cursor.moveToNext() && contactCounter < limit); } cursor.close(); return results; } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.