2014-03-26 43 views
0

我正在嘗試進行篩選聯繫人的查詢,以僅檢索具有特定帳戶類型的聯繫人。基於raw_contact查詢android聯繫人ACCOUNT_TYPE

private void testQuery() { 
    String selection = ContactsContract.Contacts._ID + " IN (" + "SELECT " + 
      ContactsContract.RawContacts.CONTACT_ID + " FROM " + 
      "raw_contacts" + " WHERE " + 
      ContactsContract.RawContacts.ACCOUNT_TYPE + " IS NULL OR " + 
      ContactsContract.RawContacts.ACCOUNT_TYPE + " = 'com.google'" + ")"; 

    Cursor c = null; 

    try { 
     c = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, 
      null, 
      selection, 
      null, null); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 

    if(c != null) { 
     int indexName = c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); 

     while(c.moveToNext()) { 
      String name = c.getString(indexName); 

      // TODO: 
     } 

     c.close(); 
    } 
} 

的問題是,它適用於Android 2.2,但它:

我使用下面的代碼是在Android 2.2的作品,但在新的機器人不工作(如Android 4.4.2)這樣做在新的android(android 4.4.2)上拋出一個異常。異常是:SQLiteException:沒有這樣的列:account_type。

我不知道爲什麼這不適用於新的機器人,但我認爲這是一個安全功能。

問題:我嘗試解決此問題是否有任何解決方法?

當前的解決方案:我目前的解決方案是,我做了2個查詢,一個在raw_contact表中,另一個在聯繫人表中。這種方法的問題在於它非常緩慢且笨拙,我不能使用好的CursorLoader,它在數據更改時負責重新加載,導致維護代碼非常非常難看並且很難。

所有幫助表示讚賞。

更新:請參閱下面的新解決方案。

回答

0

我已經解決了老機器人和新機器人的問題。問題是我應該使用視圖「view_raw_contacts」而不是表「raw_contacts」。適用於我測試過的所有機器人。

更新的選擇:

String selection = ContactsContract.Contacts._ID + " IN (" + "SELECT " + 
      ContactsContract.RawContacts.CONTACT_ID + " FROM " + 
      "view_raw_contacts" + " WHERE " + 
      ContactsContract.RawContacts.ACCOUNT_TYPE + " IS NULL OR " + 
      ContactsContract.RawContacts.ACCOUNT_TYPE + " = 'com.google'" + ")"; 

在真實設備我正則表達式希望它會在所有設備上工作,即使在那些誰修改了接觸供應商抽取視圖名。