2012-02-18 211 views
0

我正在使用带有填充槽的ListView的筛选器联系人数据包含姓名和号码。筛选联系人姓名并删除电子邮件地址

现在我有两个问题,当我键入文本EditText这在原来的火灾adapter.getFilter().filter(s.toString())

1)当我输入“AA”后(在我的代码)

我可以看到名首发从'aa'例如aakruti,但在 同时我也能够查看电子邮件地址,我不希望 使它在启动过滤器时可见。

enter image description here

2)当i型 'AA' 后者(在电话的内置联系人列表)

我可以看到的名字从 'AA' 开始例如aakruti

但我错过了一个名字,即SATYA(通过联系 进行搜索,当我在后面输入“aa”时搜索)

enter image description here

这里是我的筛选查询,里面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 

但GIV​​EN_NAME显示几email address太多,甚至它显示contact name which has email address

例如,

[email protected] 
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) 

所以谁能告诉我怎么可以限制电子邮件地址并只显示名称也只有联系电话号码?

+0

关于电子邮件地址问题,我认为你没有做错任何事情。这可能只是Android联系人的工作方式。如果你真的想排除的电子邮件,那么你可以增加一个条款,你的SQL说类似'buffer.append(”和 “+ ContactsContract.Contacts.FAMILY_NAME +” NOT LIKE '%@%');' – 2012-02-20 20:53:30

+0

@ 1KA以及好吧,因为我在Android搜索,然后我才知道上述重复是因为'加入联系人',但在联系人列表中,我可以看到劳尔Jakson作为一个,所以我怎么能使它成为一个实体就像接触一样 – Hunt 2012-02-21 04:53:29

+0

尝试包括接触ID(_ID)和过滤上,无论是通过代码或使用UNIQUE子句。 – 2012-02-21 22:30:28

回答

2

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

其次,您没有找到SATIYA,因为您的查询正在查找以AA开头的DISPLAY_NAME。 SATIYA不是一个单词,而是一系列首字母,例如答案是A.如果你想找到这些,那么你必须制定你的查询来迎合这一点。你可以搜索* A * A *,但是你也可能会得到很多其他的点击。我怀疑Android正在做一些初始+姓氏搜索的变体,其中BO会找到Barack Obama。

+0

感谢翔实的答复,你知道怎么写初始+姓约束? – Hunt 2012-02-19 19:07:06

+1

试试这个。它使用SUBSTR拿第一inital和||来连接姓氏: '缓冲液=新的StringBuilder(); buffer.append( “UPPER(SUBSTR(”); buffer.append(ContactsContract.C ontacts.GIVEN_NAME); buffer.append(“,1,1))||”); buffer.append( “UPPER(”); buffer.append(ContactsContract.Contacts.FAMILY_NAME); buffer.append( “)GLOB?”); args = new String [] {constraint.toString()。toUpperCase()+“*”}; ' – 2012-02-19 19:38:51

+0

你可以找到更多来自[他们的网站] SQLite的语法(http://www.sqlite.org/lang_expr.html)。 – 2012-02-19 19:42:00

相关问题