过滤联系人姓名并删除电子邮件地址

Posted

技术标签:

【中文标题】过滤联系人姓名并删除电子邮件地址【英文标题】:filter contact names and remove email addresses 【发布时间】:2012-03-09 20:14:11 【问题描述】:

我正在使用带有 ListView 的过滤器,它通过包含姓名和号码的联系人数据填充。

现在我在EditText 中输入文本时遇到了两个问题,而这又会触发adapter.getFilter().filter(s.toString())

1) 当我在后面输入“aa”时(在我的代码中)

我可以看到从 'aa' 开始的名称,例如 aakruti ,但在 同时我也可以查看电子邮件地址,这是我不想要的 在触发过滤器时使其可见。

2) 当我在后面输入“aa”时(在手机的内置联系人列表中)

我可以看到以“aa”开头的名称,例如 aakruti

但我缺少一个名字,即 S A T Y A(由联系人显示 当我在其中输入“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

例如,

xyz@gmail.com 
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 )

那么谁能告诉我如何限制电子邮件地址并只显示只有联系电话号码的姓名?

【问题讨论】:

关于邮箱地址问题,我不认为你做错了什么。这可能只是 android 联系人的工作方式。如果您真的想排除电子邮件,那么您可以在 SQL 中添加另一个子句,例如 buffer.append(" AND " + ContactsContract.Contacts.FAMILY_NAME + " NOT LIKE '%@%'); @1ka 好吧,当我在 android 中搜索时,我才知道上述重复是因为 Joined Contacts 但在联系人列表中我可以看到 Raul Jakson 是其中之一,所以我怎么能让它成为一个单一的实体,就像联系人一样 尝试通过代码或使用 UNIQUE 子句包含联系人 ID (_ID) 并对其进行过滤。 【参考方案1】:

首先,电子邮件显示是因为该联系人没有姓名。在这些情况下,Android 将使用电子邮件作为显示名称。为避免显示这些,请使用 GIVEN_NAME 和 FAMILY_NAME。请参阅api docs for StructuredName。

其次,您没有找到 SATIYA,因为您的查询正在寻找以 AA 开头的 DISPLAY_NAME。 SATIYA 不是一个词,它是一个首字母序列,例如S A T I Y A. 如果你想找到这些,那么你必须制作你的查询来满足这个要求。您可以搜索 *A*A*,但您也可能会获得许多其他点击。我怀疑 Android 正在做一些首字母+姓氏搜索的变体,BO 会找到巴拉克奥巴马。

【讨论】:

感谢您提供翔实的回复,您知道如何写首字母+姓氏约束吗? 试试这个。它使用 SUBSTR 来获取第一个 inital 和 ||连接姓氏: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() + "*" ; 您可以从their website 找到更多关于 SQLITE 语法的信息。

以上是关于过滤联系人姓名并删除电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章

从电话联系人中获取姓名、电话号码和电子邮件地址[关闭]

我无法从电话联系人中加载电子邮件地址

从联系人选择器意图中选择电子邮件、姓名和电话号码

使用文档对象在页面上创建学生信息表。 信息表包括学号姓名性别电子邮件联系电话个人主页和联系地址, 信息表内容通过表单输入,提交前先使用正则表达式进行验证,联系地址不能超过20

如何从 Web 服务器下载数据并保存核心数据

VB insert into 的用法