2012-12-31 140 views
10

我正在嘗試製作聯繫人到組的多對多映射。獲取聯繫人的組?

例如,如果我有:

  • 用戶1,屬於組701,702,704
  • 用戶2,不屬於任何組
  • 用戶3,屬於組702

我希望能得到一個關係,看起來像這樣:

userID | groupID 
1  | 701 
1  | 702 
1  | 704 
3  | 702 

我試過這個:

Cursor cursor = contentResolver.query(ContactsContract.Data.CONTENT_URI, null, new String[] { 
    ContactsContract.CommonDataKinds.GroupMembership.CONTACT_ID, 
    ContactsContract.CommonDataKinds.GroupMembership.GROUP_SOURCE_ID 
}, null, null, null); 

但是這不起作用。 GROUP_SOURCE_ID列會返回不是任何組的ID的怪異數字。有時甚至會返回0或負數。

我可以通過遍歷每個組來構造一個映射,並找到該組中的所有聯繫人,但這需要很多查詢,而且我試圖保持快速(顯然,只有那些少數查詢很慢!)。

任何人都可以告訴我如何在一個查詢中獲得此聯繫人到組映射嗎?

謝謝!

回答

11
Cursor dataCursor = getContentResolver().query(
      ContactsContract.Data.CONTENT_URI, 
      new String[]{ 
        ContactsContract.Data.CONTACT_ID, 
        ContactsContract.Data.DATA1 
      }, 
      ContactsContract.Data.MIMETYPE + "=?", 
      new String[]{ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE}, null 
    ); 

使用本dataCursor你會得到在接觸數據庫中的所有聯繫人的contact_idgroup_id

Cursor groupCursor = getContentResolver().query(
      ContactsContract.Groups.CONTENT_URI, 
      new String[]{ 
        ContactsContract.Groups._ID, 
        ContactsContract.Groups.TITLE 
      }, null, null, null 
    ); 

使用本groupCursor你會得到在接觸數據庫的所有羣體的group_idgroup_title

所以,如果你想獲得與contact_id關聯的所有組,首先使用合適的select語句獲得dataCursor。使用dataCursor,您可以獲得與該contact_id關聯的所有group_id。現在使用groupCursor,您可以獲取有關與該特定聯繫人相關聯的所有組的信息。

+0

,完美的工作!非常感謝! 那你是怎麼知道我需要DATA1的?有沒有可以告訴我解決方案的文檔?因爲我找了很久,並找不到任何... – Verdagon

+0

@Verdagon通過檢查聯繫人數據庫 –

+0

這是一個新手應該能夠做的事情嗎?如果沒有,你能告訴我怎麼樣,我可以寫一篇文章或其他東西? – Verdagon

2

完整的回答將是: 首先獲取組光標(與上述相同的答案)

Cursor groups_cursor= getContentResolver().query(
     ContactsContract.Groups.CONTENT_URI, 
     new String[]{ 
       ContactsContract.Groups._ID, 
       ContactsContract.Groups.TITLE 
     }, null, null, null 
); 

存儲所有GROUP_ID和group_title在一個組HashMap中使用此代碼:

if(groups_cursor!=null){ 
     while(groups_cursor.moveToNext()){ 
      String group_title = groups_cursor.getString(1); 
      String id = groups_cursor.getString(0); 
      groups.put(id, group_title); 
     } 
    } 

然後使用上面的答案的data_cursor,獲取contacts_ids和他們的group_ids。

Cursor dataCursor = getContentResolver().query(
     ContactsContract.Data.CONTENT_URI, 
     new String[]{ 
       ContactsContract.Data.CONTACT_ID, 
       ContactsContract.Data.DATA1 
     }, 
     ContactsContract.Data.MIMETYPE + "=?", 
     new String[]{ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE}, null 
); 

現在使用dataCursor和組HashMap。

if(dataCursor!=null){ 
      while(dataCursor.moveToNext()){ 
       String id = dataCursor.getString(0); 
       String group_id= dataCursor.getString(1); 
       String groupTitle = groups.get(group_id); 
       Log.d(TAG, "groupTitle : " + groupTitle + " contact_id: " + id); 
      } 
    } 
0
public static HashMap<String, String> getContactsForGroup(String groupID, Activity activity){ 
    Cursor dataCursor = activity.getContentResolver().query(
      ContactsContract.Data.CONTENT_URI, 
      new String[]{              // PROJECTION 
        ContactsContract.Data.CONTACT_ID, 
        ContactsContract.Data.DISPLAY_NAME,   // contact name 
        ContactsContract.Data.DATA1     // group 
      }, 
      ContactsContract.Data.MIMETYPE + " = ? " + "AND " +     // SELECTION 
      ContactsContract.Data.DATA1 + " = ? ",   // set groupID 
      new String[]{              // SELECTION_ARGS 
        ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE, 
        groupID 
      }, 
      null 
    ); 

    dataCursor.moveToFirst(); 
    HashMap<String, String> map = new HashMap<>(); 
    while (dataCursor.moveToNext()) // 
    { 
     String s0 = dataCursor.getString(0);    //contact_id 
     String s1 = dataCursor.getString(1);    //contact_name 
     String s2 = dataCursor.getString(2);    //group_id 
     Log.d("tag", "contact_id: " + s0 + " contact: " + s1 + " groupID: "+ s2); 
     map.put(s0, s1); 
    } 
    return map; 
} 
+0

一些建議...將'while'循環改爲'do while'循環。由於代碼是現在編寫的,它總是會跳過表的第一行,因爲cursor.moveToFirst()將指針放在索引0處,但while(cursor.moveToNext())'將它放到索引1處。應該關閉()'光標(即用try finally塊)。最後'dataCursor.moveToFirst()'理論上可以拋出一個NPE,所以添加一個空檢查。 – k2col