私は ContactsContract を調査するために使用している "ダンプ" ユーティリティを持っています。連絡先をダンプすると、テーブルに 263 件のレコードがカウントされますが、デバイス リストの連絡先アプリケーションには 244 件あります (「244 件の連絡先を表示しています」)。
誰かが不一致を説明できますか?
私の Sprint LG の連絡先アプリには、同期しているアカウントごとに表示オプションがあり、すべてのアカウントにアクセスしてチェックしたので、フィルタリングは必要ありません。
ユーティリティで使用している主な URI は次のとおりです。
Uri uriRawContacts = ContactsContract.RawContacts.CONTENT_URI;
String[] projection = new String [] {
ContactsContract.RawContactsEntity._ID,
ContactsContract.RawContactsEntity.CONTACT_ID,
ContactsContract.RawContactsEntity.DELETED,
ContactsContract.RawContactsEntity.AGGREGATION_MODE,
};
Cursor cursorRaw = cr.query(uriRawContacts, projection, null, null, null);
DumpCursor.dumpAnyCursor(getApplicationContext(), "RawContacts", cr, cursorRaw, ",");
続いて (上記のクエリの各 _ID に対して):
long rawContactId = Long.parseLong(anyCursor.getString(anyCursor.getColumnIndex(RawContacts.CONTACT_ID)));
Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
Uri entityUri = Uri.withAppendedPath(rawContactUri, Entity.CONTENT_DIRECTORY);
Log.d(TAG, "rawContactUri: " + rawContactUri.toString());
Log.d(TAG, "entityUri: " + entityUri.toString());
Cursor c = cr.query(entityUri, new String[] { RawContacts.SOURCE_ID, Entity.DATA_ID, Entity.MIMETYPE, Entity.DATA1 }, null, null, null);
次に、最初のクエリをループし、プロジェクションのすべての列を表示します。次に、最初のクエリのループで _ID フィールドを使用して、2 番目のクエリを発行し、その列をすべてダンプします。
便宜上、回答の箇条書きをここに転置します 。詳細な説明については、リファレンスを参照してください。具体的には、集計ルールについて読むことをお勧めします。 参照:以下の元の引用テキストについては、ここをクリックしてください
- 連絡先データベースは、連絡先、生の連絡先、およびデータの 3 つのテーブルに分かれています。
各テーブルには、自動インクリメントされた主キーである列 (_ID) が含まれています。- データ テーブルには、電話番号、メール ID、
住所などのすべての連絡先情報が含まれています。- 生の連絡先は、作成された実際の連絡先を指します。したがって、連絡先を追加する際に未加工の連絡先を使用します。
- ユーザーは連絡先テーブルにデータを追加できません。このテーブルのデータは 、連絡先が集約
されているため、内部的に入力されます。一部の連絡先でロジックが機能した理由は次のとおりです。連絡先の_ID、未加工の連絡先は、連絡先の集約が行われるまで同じままです。同じ名前 abc の 2 つの連絡先を追加するとします。ここでは、未加工の連絡先の _ID は 2 回増加しますが、連絡先の _ID は 1 回だけ増加します。これは、連絡先の集約によりこれら 2 つの連絡先がマージされるためです。