Intereting Posts
Специфическое оповещение Android Wear ScrollView .scrollTo не работает? Сохранение позиции ScrollView при вращении Изменить расширяемый индикатор в ExpandableListView Как изменить стиль андроида «принудительно закрыть окно»? Предоставляет ли веб-браузер Android возможность загружать фотографии, только что снятые с камеры? IntelliJ IDEA публикует приложение Android одним щелчком мыши? Как создать ссылку для всех мобильных устройств, которые открывают карты Google с маршрутом, начинающимся с текущего местоположения, определяющим данное место? Каков цвет Hex по умолчанию для Holo.Light.DarkActionBar ActionBar Android-эмулятор: не удалось выбрать выделение Android VideoView: просмотр видео в диалоговом окне намного темнее Как сохранить запланированную тревогу после того, как приложение было убито Android или убийцей задачи? Проверьте права на Android в методе Ширина диалогового окна Android Ошибка в создании приложения для Android с использованием apache cordova Что происходит, когда вы нажимаете значок запуска приложения?

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

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

Solutions Collecting From Web of "В чем разница между контактами и сырыми контактами?"

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

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

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

Дайте мне знать, если вам нужно что-нибудь еще.

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

ContactsContract.Contacts table: – Строки, представляющие разные люди, основанные на совокупности строк raw-контактов.

ContactsContract.RawContacts table: – Строки, содержащие сводку данных пользователя, относящихся к учетной записи пользователя и типу.

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

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