2017-08-17 1 views
0

Je ne peux pas obtenir tous les ids de contact de la table RawContactscontact Ids sont absents lors de l'interrogation à la table des contacts bruts en fonction du nom du compte

private void displayAllContactsByType(String accountName) 
{//e.g accountName="WHATSAPP" 

    Cursor rawCursor = null; 

     rawCursor = cResolver.query(
       ContactsContract.RawContacts.CONTENT_URI, 
       new String[]{ContactsContract.RawContacts.CONTACT_ID}, 
       ContactsContract.RawContacts.ACCOUNT_NAME + "= ?", 
       new String[]{accountName}, 
       ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " COLLATE LOCALIZED ASC"); 


    rawCursor.moveToFirst(); 

    int contactIdColumn = rawCursor.getColumnIndex(ContactsContract.RawContacts.CONTACT_ID); 
    int rawCursorCount = rawCursor.getCount(); 
    int total = 1; 

    Utils.Log("Raw Size", " " + rawCursorCount);//rawCursorCount is correct here 

    while (rawCursor.moveToNext()) { 

     Long contactId = rawCursor.getLong(contactIdColumn); 

     publishProgress(((total * 100)/rawCursorCount)); 
     progressBar.setProgressNumberFormat("" + total + "/" + rawCursorCount); 

     storeContactDetails(contactId, accountName); 
     ++total; 
//I am facing problem in this method only below code is just for understanding. 
    } 
} 

Contactez ids sont passés à la méthode ci-dessous avec le nom de compte pour obtenir la les détails de contact de l'id respectif mais les identifiants de contact sont moins comparés au log //Utils.Log("Raw Size "," "+ rawCursorCount).

private void storeContactDetails(Long id, String accountName) { 

    Cursor phones = null; 
    String[] projection = new String[]{ContactsContract.CommonDataKinds.Phone.CONTACT_ID, 
      ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
      ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER, 
      ContactsContract.CommonDataKinds.Phone.NUMBER, 
      ContactsContract.Contacts.LOOKUP_KEY, 
      "account_name", 
      Phone.TYPE 
    }; 



    //Cursor c=cResolver.query(ContactsContract.Data.CONTENT_URI,projection,ContactsContract.Data.RAW_CONTACT_ID + " = ?",new String[]{String.valueOf(id)} ,null); 

     phones = cResolver.query(Phone.CONTENT_URI, 
       projection, 
       Phone.CONTACT_ID + " = ?", 
       new String[]{String.valueOf(id)}, 
       null); 


    phones.moveToFirst(); 
    getResultsFromPhoneCursor(phones, accountName); 

} 

    public void getResultsFromPhoneCursor(Cursor phones, String accountName) { 

    int colorcounter = 0; 
    String[] colorcounter_array = {"#91A46B", "#8BB6B5", "#CAA973", "#8DA6C8", "#D19B8D"}; 

    int color_string; 
    String email_Id = ""; 
    String contactType = ""; 

    try { 
     contactId = 0; 
     String hasPhone = ""; 
     display_name = ""; 
     phoneNumber = ""; 

     contactId = phones.getLong(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID)); 
     display_name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)).trim(); 

     hasPhone = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER)); 

     if (hasPhone.equalsIgnoreCase("1")) 
      hasPhone = "true"; 

     else 
      hasPhone = "false"; 

     if (Boolean.parseBoolean(hasPhone)) { 
      do { 

       this.accountName = phones.getString(phones.getColumnIndex("account_name")); 
       phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

       int type = phones.getInt(phones.getColumnIndex(Phone.TYPE)); 

       switch (type) { 
        case Phone.TYPE_HOME: 
         contactType = "HOME"; 
         break; 
        case Phone.TYPE_MOBILE: 
         contactType = "MOBILE"; 
         break; 
        case Phone.TYPE_WORK: 
         contactType = "WORK"; 
         break; 
       } 

       String lookupKey = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)); 

       if (colorcounter < 5) { 
        color_string = Color.parseColor(colorcounter_array[colorcounter]); 
        colorcounter++; 
       } else { 
        colorcounter = 0; 
        color_string = Color.parseColor(colorcounter_array[colorcounter]); 
        colorcounter++; 
       } 

       Cursor emails = cResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, new String[]{ContactsContract.CommonDataKinds.Email.DATA}, 
         ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId, null, null); 

       while (emails.moveToNext()) { 
        email_Id = emails.getString(emails 
          .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
       } 

       emails.close(); 

       if (this.accountName.equalsIgnoreCase(accountName)) { 

        if (!contactList.contains(new ContactsWrapper(contactId, display_name, phoneNumber, lookupKey, false, color_string, email_Id, contactType))) 
         contactList.add(new ContactsWrapper(contactId, display_name, phoneNumber, lookupKey, false, color_string, email_Id, contactType)); 
       } 
      } 

      while (phones.moveToNext()); 
      phones.close(); 
     } 
    } catch (Exception e) { 

     e.printStackTrace(); 
    } 

} 

aidez-moi à résoudre ce cas ou suggérer d'autres moyens d'obtenir les coordonnées de contact. Merci d'avance.

Répondre

1

Le problème est que vous perdez le premier contact que vous récupérez à partir de la base de données.

L'instruction rawCursor.moveToFirst(); positionne le curseur sur le premier enregistrement de résultat disponible. Le, lorsque vous voulez parcourir les résultats, vous appelez rawCursor.moveToNext() dans votre boucle. La condition de boucle est exécutée avant son corps, donc, vous finissez par déplacer le curseur sur la deuxième ligne, en perdant le premier enregistrement.

Vous pouvez résoudre ce problème en vous débarrassant de rawCursor.moveToFirst().