Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:ContactsContract查询,需要更高级的选择字符串_Java_Android_Contacts_Android Contentprovider - Fatal编程技术网

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);
}