0

この質問投稿にあるコードの実装を使用しようとしています: Android 2.0 で連絡先を読み取る方法ですが、指定された、家族、または表示名の列でも実行する方法がわかりません。この実装(リンクされた質問の大きなもの)を取得して、各行をループするときに連絡先の名前と表示名を取得するにはどうすればよいですか? この実装を特に使用したいのは、各行の指定された列をループし、行にある順序で情報を返すためです。

これは、私が参照している他の質問の実装です:\

Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); 

while (cursor.moveToNext()) { 

   String contactId = cursor.getString(cursor.getColumnIndex( 
   ContactsContract.Contacts._ID)); 

   String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));

   if (Boolean.parseBoolean(hasPhone)) { 
      // You know it has a number so now query it like this
      Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, null, null); 

while (phones.moveToNext()) { 
     String phoneNumber = phones.getString(phones.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER));                 
  } 
  phones.close(); 
   }

   Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId, null, null); 

   while (emails.moveToNext()) { 
      // This would allow you get several email addresses 
      String emailAddress = emails.getString( 
      emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));

   } 

   emails.close();
}

cursor.close(); 
4

1 に答える 1

1

まず、developer.android.comに連絡先プロバイダーのドキュメントがあるため、リンクされた投稿の回答は少し時代遅れです。

次に、発生している問題は、連絡先テーブルの連絡先IDを使用して「データ」テーブルにクエリを実行しているため、機能しないことです。

連絡先プロバイダーは、テーブルの3層配置です。最上位はContactsテーブルであり、その定数はContactsContract.Contactsで定義されています。その列の1つはContactsContract.Contacts._IDで、連絡先の行を識別します。ただし、このテーブルの行は、さまざまなソースからの個々の連絡先の集計です。

個々の連絡先はContactsContract.RawContactsに保存されます。すべてのContactsContract.Contacts._IDについて、ContactsContract.RawContactsに複数の行を含めることができます。

ContactsContract.RawContactsの各行について、ContactsContract.Dataには1つ以上の行があります。各行には、データの種類を示すMIMEタイプがあります。たとえば、ContactsContract.RawContactsの行には、電話番号のMIMEタイプを持つContactsContract.Dataの3つの行を含めることができます。3つの「データ」行はそれぞれ、ContactsContract.RawContactsの連絡先の異なるタイプの電話番号(自宅、携帯電話、職場)です。

ContactsContract.DataでContactsContract.Contacts._IDを検索しても機能しない理由がわかります。それは探すのに間違ったIDです。

ここでドキュメントを書き直すのではなく、それを確認することをお勧めします。それは私が得ているものを説明するのに役立ついくつかの素晴らしいイラストを持っています: 連絡先プロバイダー

于 2012-11-13T21:13:25.313 に答える