фильтровать имена контактов и удалять адреса электронной почты

Я использую фильтр с ListView, который заполняется контактными данными, содержащими имена и номера.

Теперь у меня есть две проблемы, когда я набираю текст в EditText, который, в свою очередь, срабатывает adapter.getFilter().filter(s.toString())

1) Когда я набираю «аа» последним (в моем коде)

я могу видеть имя, начинающееся с «аа», например, aakruti, но в то же время я также могу просматривать адреса электронной почты, которые я не хотел делать видимыми при срабатывании фильтра.

введите здесь описание изображения

2) Когда я набираю «аа» последним (во встроенном списке контактов телефона)

я вижу имя, начинающееся с «аа», например, аакрути

но мне не хватает одного имени, то есть SATYA (которое отображается при поиске контактов, когда я ввожу в него «aa»)

введите здесь описание изображения

вот мой запрос фильтра, внутри runQueryOnBackgroundThread

StringBuilder buffer = null;
String[] args = null;
    if (constraint != null) {
    buffer = new StringBuilder();
    buffer.append("UPPER(");
    buffer.append(ContactsContract.Contacts.DISPLAY_NAME);
    buffer.append(") GLOB ?");
    args = new String[] { constraint.toString().toUpperCase() + "*" };
    }
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
System.out.println(buffer);
return mContent.query(
            ContactsContract.Contacts.CONTENT_URI, 
            projection,
            buffer == null ? null : buffer.toString(), 
            args,sortOrder
);

проекционные данные

   public static String[] projection = new String[] {
           ContactsContract.Contacts._ID,
           ContactsContract.Contacts.DISPLAY_NAME

   };

ИЗМЕНИТЬ

До сих пор я пытался получить доступ

ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME
ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME
ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME

Но GIVEN_NAME тоже показывает мало email address и даже показывает contact name which has email address

Например ,

[email protected] 
Raul Jakson          (which only has email address no contact number)
Raul Jakson          ( i see this name twice as it has two different email address , but i wanna see it as name )

Так может ли кто-нибудь сказать мне, как я могу ограничить адреса электронной почты и показать только ИМЕНА, которые имеют только контактные номера телефонов?


person Hunt    schedule 18.02.2012    source источник
comment
Что касается проблемы с адресом электронной почты, я не думаю, что вы делаете что-то неправильно. Вероятно, так работают контакты Android. Если вы действительно хотите исключить электронные письма, вы можете добавить еще одно предложение в свой SQL, чтобы сказать что-то вроде buffer.append(" AND " + ContactsContract.Contacts.FAMILY_NAME + " NOT LIKE '%@%');   -  person SoftWyer    schedule 21.02.2012
comment
@1ka хорошо, хорошо, когда я искал в андроиде, я узнал, что приведенное выше повторение происходит из-за Joined Contacts, но в списке контактов я вижу Рауля Джексона как одного, так как я могу сделать его одной сущностью, как это делает контакт   -  person Hunt    schedule 21.02.2012
comment
Попробуйте включить идентификатор контакта (_ID) и отфильтровать его либо с помощью кода, либо с помощью предложения UNIQUE.   -  person SoftWyer    schedule 22.02.2012


Ответы (1)


Во-первых, электронные письма появляются, потому что у этого контакта нет имени. В этих случаях Android будет использовать адрес электронной почты в качестве отображаемого имени. Чтобы они не отображались, используйте GIVEN_NAME и FAMILY_NAME. См. документацию API для StructuredName.

Во-вторых, вы не найдете SATIYA, так как ваш запрос ищет DISPLAY_NAME, начинающийся с AA. САТИЯ — это не слово, это последовательность инициалов, например, С А Т И Я А. Если вы хотите их найти, вам придется создать свой запрос, чтобы удовлетворить это. Вы можете искать *A*A*, но вы, вероятно, получите и много других совпадений. Я подозреваю, что Android выполняет какой-то вариант поиска по инициалам + фамилии, где BO найдет Барака Обаму.

person SoftWyer    schedule 19.02.2012
comment
Спасибо за информативный ответ, вы знаете, как написать ограничение инициал+фамилия? - person Hunt; 19.02.2012
comment
Попробуй это. Он использует SUBSTR для получения первого инициала и || чтобы объединить фамилию: buffer = new StringBuilder(); buffer.append("UPPER(SUBSTR("); buffer.append(ContactsContract.Contacts.GIVEN_NAME); buffer.append(",1,1)) || "); buffer.append("UPPER("); buffer.append(ContactsContract.Contacts.FAMILY_NAME); buffer.append(") GLOB ?"); args = new String[] { constraint.toString().toUpperCase() + "*" }; - person SoftWyer; 19.02.2012
comment
Дополнительную информацию о синтаксисе SQLITE можно найти на их веб-сайте. - person SoftWyer; 19.02.2012