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