В чем разница между контактами и необработанными контактами?

У меня есть утилита «дампа», которую я использую для изучения 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 в цикле первого запроса, Я выполняю второй запрос и выгружаю все его столбцы.

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

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

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

21
задан Community 23 May 2017 в 12:00
поделиться