3

編集:重要な連絡先の詳細と考えられるもののリスト:

1.NAME
2.PHONE NUMBER
3.EMAIL ADDRESS
4.WEBSITE
5.PHYSICAL ADDRESS 

事前にフェッチされた contactId を使用してこれを行うことをお勧めします... 1 つのカーソルのみを使用して、指定されたすべてのデータを取得します。できれば、これを行うための適切なクエリを見つけたいと思います。

連絡先のすべての重要な詳細を一度に取得したいので、次のコードを使用してこれを行います。

       public void getAllDataByContactId(int contactId)
{
    Log.d(TAG, "Seriously scared it might not work");
    String phoneNo="Phone disconnected";
    String email="Email could not be delivered";
    String website="Website 404";
    String address="Number 13,Dark Street,Area 51,Bermuda Trianlge";
    String name="Clint Eastwood";
    int hasPhoneNumber;
    String selection=ContactsContract.Data.CONTACT_ID+"=?";
    String[] selectionArgs={String.valueOf(contactId)};
    Cursor c=context.getContentResolver().query(ContactsContract.Data.CONTENT_URI, null,selection, selectionArgs,ContactsContract.Data.TIMES_CONTACTED);

    if(c!=null && c.getCount()>0)
    {

        while(c.moveToNext())
        {

            phoneNo=c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            Log.d(TAG, "Phone number: "+phoneNo);
            email=c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS));
            Log.d(TAG, "Email: "+email);
            website=c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Website.URL));
            Log.d(TAG, "Website :"+website);
            address=c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS));
            name=c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME));
            Log.d(TAG, "Name :"+name);
        }
    }   
}

ただし、これはエラーをスローしませんが、実際の値が挿入された空の文字列で構成される行が多数表示されます。ノイズを除去するクエリを作成するにはどうすればよいですか?

私はこれを試しましたが、これは私にすべての値を取得します:

             String selection=ContactsContract.Data.CONTACT_ID+"=? AND "+ContactsContract.Data.MIMETYPE+"=? OR "+ContactsContract.Data.MIMETYPE+"=? OR "+ContactsContract.Data.MIMETYPE+"=? OR "+ContactsContract.Data.MIMETYPE+"=? OR "+ContactsContract.Data.MIMETYPE+"=?";
    String[] selectionArgs={String.valueOf(contactId),ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE,ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE,ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE,ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE};
4

2 に答える 2

1

答えるには遅すぎますが、将来誰かを助けることができるかもしれません。whileサイクルとクエリが1つだけのこの質問に対する私の解決策:

private void fetchContacts(ContentResolver contentResolver) {
        if (contentResolver == null) return;

        Cursor cursor = contentResolver.query(ContactsContract.Data.CONTENT_URI,
                null, null, null, null);

        if (cursor == null || cursor.getCount() <= 0) {
            return;
        }

        String prevId = "";
        String contactId = "";
        PersonContact personContact = null;
        while (cursor.moveToNext()) {
            String company = "";
            String columnName = cursor.getString(cursor.getColumnIndex("mimetype"));
            if (columnName.equals(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)) {
                company = cursor.getString(cursor.getColumnIndex("data1"));
            }

            String email = "";
            if (columnName.equals(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)) {
                email = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
            }
            String phone = "";
            if (columnName.equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) {
                phone = cursor.getString(cursor.getColumnIndex("data1"));
            }
            String first = "";
            String last = "";
            if (columnName.equals(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)) {
                first = cursor.getString(cursor.getColumnIndex("data2"));
                last = cursor.getString(cursor.getColumnIndex("data3"));
            }

            if (!prevId.equals(contactId)) {
                if (!TextUtils.isEmpty(prevId)) {
                    addFilteredList(personContact);
                    allContacts.put(prevId, personContact);
                }
                prevId = contactId;
                personContact = new PersonContact();
            } else {
                if (personContact != null) {
                    personContact.id = prevId;
                    if (TextUtils.isEmpty(personContact.company)) personContact.company = company;
                    if (TextUtils.isEmpty(personContact.firstName)) personContact.firstName = first;
                    if (TextUtils.isEmpty(personContact.lastName)) personContact.lastName = last;
                    if (!TextUtils.isEmpty(email) && personContact.emails.size() == 0) {
                        personContact.emails.add(email);
                    }
                    if (!TextUtils.isEmpty(phone) && personContact.phoneNumbers.size() == 0) {
                        personContact.phoneNumbers.add(phone);
                    }
                }
            }

            contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
        }
        cursor.close();
    }

ご覧のとおり、cursor.moveToNext は 1 つの連絡先に対して複数回実行されるため、prevId フィールドを使用しました (姓名に対して 1 回、電話番号に対して 1 回など)。各反復の後、以前の連絡先 ID を現在の ID と照合し、偽の場合は personContact モデルのフィールドを更新します。

于 2019-02-12T11:22:41.720 に答える