2012-02-18 212 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

相關問題