В чем разница между контактами и raw-контактами? - PullRequest
20 голосов
/ 11 марта 2011

У меня есть утилита «dump», которую я использую для изучения ContactsContract, так как я не совсем понял ее в документации. Когда я сбрасываю контакты, в таблице насчитывается 263 записи, однако приложение контактов в моем устройстве отображает, что у меня 244 («Отображение 244 контактов»)

Может кто-нибудь объяснить несоответствие?

В приложении Sprint LG's Contacts есть параметры отображения для каждой из учетных записей, которые я синхронизирую, и я вошел и проверил все из них, поэтому фильтрации не должно быть.

Основной 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 в цикле первого запроса, я выдаю второй запрос и выводю все его столбцы.

Пули из ответа транспонированы здесь для удобства: См. Ссылку для более подробного объяснения. Более конкретно, вам предлагается прочитать о правилах агрегирования. Ссылка: Нажмите сюда для оригинального цитируемого текста, следующего за

  • База данных контактов разделена на 3 таблицы контактов, необработанных контакты и данные.
  • Каждая таблица содержит столбец (_ID), который является первичным с автоинкрементом
    ключ.
  • Таблица данных содержит всю контактную информацию, такую ​​как номер телефона, почтовый идентификатор,
    адрес и т. д.
  • Необработанные контакты указывают на фактический созданный контакт. Отсюда мы использовать необработанные контакты при добавлении контакт.
  • Пользователь не может добавить какие-либо данные в таблицу контактов. Данные в этом
    таблица заполняется из-за
    агрегация контактов.

Причина, по которой ваша логика сработала из контактов есть: _ID для контактов, сырые контакты остаются такими же до тех пор, пока любой сбор агрегации контактов место. Допустим, вы добавили два контакта с тем же именем abc. Здесь _ID для необработанные контакты увеличиваются в два раза, пока _ID для контактов увеличивается только один раз, так как эти два контакта объединяются из-за до объединения контактов

Ответы [ 2 ]

23 голосов
/ 11 марта 2011

Это различие связано с объединением RawContacts в Contacts из-за правила агрегирования.

Вы добавляете контакт в RawContacts, пока в списке отображаются контакты.Отсюда разница в числе.

Пожалуйста, найдите некоторое описание между Contacts, RawContacts и Data здесь .Даже если вопрос другой, вы можете получить разницу между Contacts и RawContacts.

5 голосов
/ 15 февраля 2016

На три таблицы обычно ссылаются по именам классов контрактов.Классы определяют константы для URI содержимого, имен столбцов и значений столбцов, используемых таблицами:

ContactsContract.Contacts таблица: - Строки, представляющие разных людей, на основе агрегации необработанных строк контактов.

ContactsContract.RawContacts таблица: - строки, содержащие сводные данные о человеке, относящиеся к учетной записи и типу пользователя.

ContactsContract.Data таблица: - строки, содержащие данные для необработанного контакта, например адреса электронной почты или номера телефонов.

для получения дополнительной информации нажмите

...