java–Android:ContactsContract查询,需要更高级的选择字符串

java–Android:ContactsContract查询,需要更高级的选择字符串,第1张

概述我正在尝试查询ContactContractContentProvider并获取以下算法将获得的数据:givenaphonenumber(input),returnrecord...:if(recordNumberhas7digits){if('%recordNumber'LIKE'inputNumber'){returnrecordDisplayName;}}elseif(record

我正在尝试查询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 ?"

至:

ContactsContract.CommonDataKinds.Phone.NUMBER+" liKE '?'"

导致运行时错误“绑定或列索引超出范围…”.所以这必须是一些语法错误……对吗?什么是ContentProvIDer查询的正确语法和/或我如何从ContactsContract获取结果集?

解决方法:

对ContentProvIDers的查询有点不同,并且对格式化无法容忍.对于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位数,则必须进行完全匹配.

总结

以上是内存溢出为你收集整理的java – Android:ContactsContract查询,需要更高级的选择字符串全部内容,希望文章能够帮你解决java – Android:ContactsContract查询,需要更高级的选择字符串所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1114171.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存