запросов к ContentProviders немного отличаются и не прощают форматирования.для ContentProviders: если вы хотите использовать «%» в качестве символа подстановки, «%» должен быть объединен с аргументом в предложении WHERE, а не как часть самого предложения.
correct:
Cursor cursor = getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.NUMBER+" LIKE ?",
new String[] { "%"+number },
null);
неверно:
Cursor cursor = getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.NUMBER+" LIKE %?",
new String[] { number },
null);
вышеприведенный «неправильный» оператор фактически полностью допустим для запросов SQLite, только не для запросов ContentProvider.
кроме того, одинарные кавычкиявляются синтаксической ошибкой в предложении WHERE запроса ContentProvider (или связаны с аргументами в указанном предложении).
окончательный код:
if(number.length()==7) {
cursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.NUMBER+" LIKE ?",
//"('%" + ContactsContract.CommonDataKinds.Phone.NUMBER+"' LIKE '?' AND LENGTH("+ContactsContract.CommonDataKinds.Phone.NUMBER+")=7) OR ('" + ContactsContract.CommonDataKinds.Phone.NUMBER+"' LIKE '%?' AND LENGTH("+ContactsContract.CommonDataKinds.Phone.NUMBER+")=10)",
new String[] { "%"+number },
null);
} else if(number.length()==10) {
cursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, null,
"("+ContactsContract.CommonDataKinds.Phone.NUMBER+"=? AND LENGTH("+ContactsContract.CommonDataKinds.Phone.NUMBER+")=7) OR ("+ContactsContract.CommonDataKinds.Phone.NUMBER+"=? AND LENGTH("+ContactsContract.CommonDataKinds.Phone.NUMBER+")=10)",
new String[] { number.substring(3), number },
null);
} else {
cursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.NUMBER+"=?",
new String[] { number },
null);
}
этот код будет извлекать соответствующие отображаемые имена для телефонных номеров, которыесоответствует рассматриваемому номеру.
- если номер представляет собой 7-значный номер, мы извлекаем любые записи, чьи номера телефонов имеют последние 7 цифр (дефисы и специальные символы, кроме "*" и "#", поскольку они являются действительными телефонными символами) соответствует 7 цифрам рассматриваемого номера.
- если число представляет собой 10-значное число, оно возвращает любые записи, содержащие либо 7 цифри соответствуют последним 7 символам или содержат точное совпадение в случае, если запись имеет 10 цифр.
- если в рассматриваемом номере нет ни 7, ни 10 цифр, точное совпадение необходимо.