5

連絡先の名と姓を取得するための次のコードがあります。

                uri = ContactsContract.Data.CONTENT_URI;
                Cursor curName = getContentResolver().query(uri, null, ContactsContract.Data.CONTACT_ID +" = "+ contactId, null, null);
                if (curName.getCount() > 0){
                    curName.moveToFirst();
                    String nameGiven = curName.getString(curName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
                    String nameFamily = curName.getString(curName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
                    log += nameGiven + ", " + nameFamily + ": ";
                }

連絡先は 1 つしかないので、ループは必要ありません。2.3.5 デバイスでは問題なく動作し、正しい名前が返されます。ただし、4.0.4 デバイスでは、両方のフィールドに null が返されますが、表示名を要求すると正しく提供されます。

何が問題なのですか?

4

2 に答える 2

2

まあ、データ テーブルと連絡先テーブルの _ID は 2 つの異なるものです。したがって、データ テーブルをクエリするときは、 _idの代わりにraw_contacts_idを使用する必要があります。

開始するための簡単なコードを挿入させてください

// projection
String[] projection = new String[] {ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME};

String where = ContactsContract.Data.RAW_CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
String[] whereParameters = new String[]{this.contact_id, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE};

//Request
Cursor contacts = this.resolver.query(ContactsContract.Data.CONTENT_URI, projection, where, whereParameters, null);

//Iteration
if (contacts.moveToFirst()) { 
    //code here, E.g
                String nameGiven = contacts.getString(contacts.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
                String nameFamily = contacts.getString(contacts.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));

                //log += nameGiven + ", " + nameFamily + ": "; 

} 
contacts.close();
于 2013-02-11T12:03:25.823 に答える
0

こんにちは、カーソルのクエリを修正する必要があると思います。通常、このように使用します

Cursor c = getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, ContactsContract.Data.CONTACT_ID + " = ?", new String[] {String.valueOf(contactId)}, null);
if (c.moveToFirst()){
    // get your code to get content on that cursor ex: c.getString(0)
}

このリンクで確認して ください。これがお役に立てば幸いです。

于 2013-02-18T07:42:31.663 に答える