3

電話帳の連絡先のクエリに問題があります。私がする必要があるのは、電話と電子メールの両方が入力されているか、特定のタイプの連絡先のリストを取得することです。

基本的にこのように:

public static final String SELECTION =
    "("+ContactsContract.Contacts.HAS_PHONE_NUMBER +"='1') OR " + RawContacts.ACCOUNT_TYPE + "='" + Constants.ACCOUNT_TYPE + "'";

さて、問題は、それが私のクエリで使用するにRawContacts.ACCOUNT_TYPE存在しないということです。ContactsContract.Contacts.CONTENT_URI別のテーブルに参加する必要があると思いますが、その方法がわかりません。

誰かがここで私を助けてくれますか?

4

2 に答える 2

2

未加工の連絡先とそれに関連するすべてのデータを読み取る最良の方法は、ContactsContract.RawContacts.Entityディレクトリを使用することです。生の連絡先にデータ行がある場合、エンティティカーソルには各データ行の行が含まれます。生の連絡先にデータ行がない場合でも、カーソルには生の連絡先レベルの情報を含む1つの行が含まれます。

Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
 Uri entityUri = Uri.withAppendedPath(rawContactUri, Entity.CONTENT_DIRECTORY);
 Cursor c = getContentResolver().query(entityUri,
          new String[]{RawContacts.SOURCE_ID, Entity.DATA_ID, Entity.MIMETYPE, Entity.DATA1},
          null, null, null);
 try {
     while (c.moveToNext()) {
         String sourceId = c.getString(0);
         if (!c.isNull(1)) {
             String mimeType = c.getString(2);
             String data = c.getString(3);
             //decide here based on mimeType, see comment later
         }
     }
 } finally {
     c.close();
 }

mimeTypeに基づいて結果をフィルタリングする必要があります

たとえば、mimeTypeがPhone.CONTENT_ITEM_TYPE、の場合、列DATA1には電話番号が格納されますが、データの種類がEmail.CONTENT_ITEM_TYPE、の場合DATA1、電子メールアドレスが格納されます。

HAS_PHONE_NUMBERこの方法では、アイテムを直接反復処理するため、使用する必要はありません。

于 2010-06-23T09:18:56.397 に答える
1

Email.CONTENT_URIMIMEタイプのすべてのデータレコードが含まれているため、関連する生の連絡先および集計連絡先データ"vnd.android.cursor.item/email_v2"と組み合わせて使用​​する必要があります。

于 2010-06-23T09:18:45.900 に答える