2016-08-11 17 views
7

Kullanıcıların bağlantıları üzerinden canlı arama yapmayı deniyorum ve eşleşen her kişinin adını, küçük resmini ve adresini (varsa) almak istiyorum.Bir sorgu ile adresli (FORMATTED_ADDRESS) kişiler nasıl aranır?

Canlı arama, kullanıcı yazarken çalışıyor.

yüzden tipleri ma ve 'martin', 'Matthews'a' alacak ...

O ulaşmak için deneyin

mat ile devam edeceğiz ve sadece 'Matthews' göreceksiniz Bu, aşağıdaki gibi tek bir sorguyla, ancak her zaman FORMATTED_ADRESS alanındaki iletişim numarasını alırım. Ben JOIN sorunu var sanırım, aynı sorguda ContactsContract.CommonDataKinds ve ContactsContract.Contacts kullanıyorum çünkü?

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()); 
    } 

Aslında

  • Contacts.DISPLAY_NAME aşağıdaki

    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); 
    
  • ancak böyle Contacts._ID ile ikinci bir sorgu başlatmak

    , Contacts._ID için sorgulama

    1. ile sorunumu çözdü bu yıldız olacak t için her bir sorgu için en iyi yaklaşım olmayabilir.

      Son sorum şu: Bu çalışmayı ilk sorgu ile almak mümkün mü?

    +0

    Neden downvote? omething? – longilong

    cevap

    0
    Mmmh, çok üzgün, kimse soruma cevap ve ödül puan ;-(burada Kayıt için

    , var benim çalışma örneği kapmak başardı. Bu sorunu çözer ama hala bir üretim düşünüyorum

    her kullanıcı girişinde (afterTextchange), ilk önce tüm kullanıcılara kendi adlarını içeren bir kimlik içeren (cursor) ve daha sonra her kullanıcının bu adresi alması için başka bir sorgu (detailCursor) başlattığım getContactsDetailsQuery'u aradım. aşırı yük, ben bir limit ekledi ..

    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; 
    } 
    
    İlgili konular