Java Android:ContactsContract查询,需要更高级的选择字符串
我正在尝试查询Java Android:ContactsContract查询,需要更高级的选择字符串,java,android,contacts,android-contentprovider,Java,Android,Contacts,Android Contentprovider,我正在尝试查询ContactContractContentProvider,并获取以下算法将获得的数据: given a phone number (input), return record...: if(recordNumber has 7 digits) { if('%recordNumber' LIKE 'inputNumber') { return recordDisplayName; } } else if(recordNumber has 10 di
ContactContract
ContentProvider,并获取以下算法将获得的数据:
given a phone number (input), return record...:
if(recordNumber has 7 digits) {
if('%recordNumber' LIKE 'inputNumber') {
return recordDisplayName;
}
} else if(recordNumber has 10 digits) {
if('recordNumber' LIKE '%inputNumber') {
return recordDisplayName;
}
} else if(recordNumber == inputNumber) {
return recordDisplayName;
}
这在查询调用中起作用:
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)"
但每次使用带有单引号的查询时,都会出现运行时错误。例如,改变:
ContactsContract.CommonDataKinds.Phone.NUMBER+" LIKE ?"
致:
导致运行时错误“绑定或列索引超出范围…”。所以这一定是一些语法错误。。。正确的?
ContentProvider
查询的正确语法是什么,和/或如何从ContactsContract
获取我要的结果集?对ContentProvider的查询有点不同,格式也不一样。对于ContentProviders,如果要将“%”用作通配符,则“%”必须连接到WHERE子句中的参数,而不是作为子句本身的一部分
正确:
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查询
此外,单引号是ContentProvider查询的WHERE子句(或连接到所述子句中的args)中的语法错误
最终代码:
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位,则需要精确匹配。使用contacts contract.commondatatypes.Phone.NORMALIZED\u号码,而不是contacts contract.commondatatypes.Phone.number我在这类查询中遇到问题,直到我注意到Data.CONTENT\u URI的使用,而不是CONTENT\u FILTER\u URI。我刚刚意识到我的语义误解。谢谢你的提示。
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);
}