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