22

私は 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 つの連絡先がマージされるためです。

4

2 に答える 2

24

この違いは、集計ルールによりRawContactsマージされるためです。Contacts

RawContactsリストに連絡先が表示されている間に連絡先を追加します。したがって、カウントの違い。

ここContactsの間の説明を見つけてください。質問は別のものですが、 と の違いを得ることができるかもしれません。RawContactsData ContactsRawContacts

于 2011-03-11T09:07:27.490 に答える