根据帐户名称查询原始联系人 table 时缺少联系人 ID

Contact Ids are missing when querying to raw contacts table according to account name

我无法从 RawContacts 中获取所有联系人 ID table

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.
    }
}

联系人 ID 与帐户名称一起传递到以下方法,以从相应 ID 获取联系人详细信息,但联系人 ID 与日志相比较少 //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();
    }

}

请帮我解决这个问题或建议任何其他方法来获得 contact_ids 。提前致谢。

问题是您丢失了从数据库中获取的第一个联系人。

语句rawCursor.moveToFirst(); 将光标定位在第一个可用的结果记录上。然后,当您想遍历结果时,可以在循环内调用 rawCursor.moveToNext() 。循环条件在它的主体之前执行,因此,您最终将光标移动到第二行,丢失了第一条记录。

您可以通过删除 rawCursor.moveToFirst() 来解决此问题。