2011-03-11 98 views
19

我有一個「轉儲」實用程序,我正在使用它來學習ContactsContract,因爲我沒有在文檔中找到它。當我轉儲聯繫人時,它會統計表中的263條記錄,但是,我的設備上的聯繫人應用程序列出了我有244(「顯示244個聯繫人」)。聯繫人與原始聯繫人有什麼區別?

我的Sprint LG的通訊錄應用程序爲我同步的每個帳戶顯示選項,並且已經進入並檢查了所有這些帳戶,因此不應該進行任何篩選。

,我使用的實用程序的主URI:(在上面的查詢每個_ID)

Uri uriRawContacts = ContactsContract.RawContacts.CONTENT_URI; 
    String[] projection = new String [] { 
      ContactsContract.RawContactsEntity._ID, 
      ContactsContract.RawContactsEntity.CONTACT_ID, 
      ContactsContract.RawContactsEntity.DELETED, 
      ContactsContract.RawContactsEntity.AGGREGATION_MODE, 
    }; 
    Cursor cursorRaw = cr.query(uriRawContacts, projection, null, null, null); 
    DumpCursor.dumpAnyCursor(getApplicationContext(), "RawContacts", cr, cursorRaw, ","); 

跟:

   long rawContactId = Long.parseLong(anyCursor.getString(anyCursor.getColumnIndex(RawContacts.CONTACT_ID))); 

       Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); 
       Uri entityUri = Uri.withAppendedPath(rawContactUri, Entity.CONTENT_DIRECTORY); 

       Log.d(TAG, "rawContactUri: " + rawContactUri.toString()); 
       Log.d(TAG, "entityUri: " + entityUri.toString()); 

       Cursor c = cr.query(entityUri, new String[] { RawContacts.SOURCE_ID, Entity.DATA_ID, Entity.MIMETYPE, Entity.DATA1 }, null, null, null); 

我然後通過第一查詢循環,顯示我的投影中的所有列,然後使用第一個查詢循環中的_ID字段發出第二個查詢並轉儲其所有列。從這裏換位爲了方便回答

子彈: 參考參考的更​​詳細的解釋。更具體地說,鼓勵您閱讀聚合規則。 價:Click here for the original cited text that follows

  • 聯繫人數據庫被分成3代表接觸,生 聯繫人和數據。
  • 每個表都包含一列(_ID),它是一個自動遞增的主鍵
    鍵。
  • 數據表包含了諸如電話號碼,郵箱ID,
    地址等
  • 的原始接觸點產生的實際接觸的所有聯繫信息。因此,我們 使用原始聯繫人,同時添加一個 聯繫人。
  • 用戶不能在聯繫人表中添加任何數據。這個
    表中的數據由於
    聚合的聯繫人而在內部填充。

你的邏輯工作了聯繫人的一些 的原因是:_ID聯繫人, 生接觸,直到有 正在 發生任何接觸的聚集保持不變。假設你添加兩個聯繫人 同名abc。在這裏,_ID爲 原料接觸增量的兩倍,而 _ID聯繫人增量只有一次因爲這兩個觸點被合併,由於 聯繫人的聚集

+0

上次批准的編輯是不正確的。如果你閱讀原文,你會看到缺少標點符號和3張表格的重點。然後,他/他把這個引用爲「數據表」,聯繫人包含所有......「您修改了原作者的正確語句。 – mobibob 2013-06-22 18:06:18

回答

22

這種差異是由於RawContacts越來越合併Contacts由於聚集規則。

當列表顯示聯繫人時,您將聯繫人添加到RawContacts。因此計數差異。

請在Contacts,RawContactsDatahere之間找到一些說明。 即使問題是不同的,你可能會得到ContactsRawContacts之間的差異。

+1

超級答案和+1。我認爲這些信息非常重要,因此我將把這個答案中的六個子彈引用並轉換爲這個問答。 – mobibob 2011-03-11 17:44:08

3

這三張表通常以其合同類別的名稱來引用。這些類定義了表格使用的內容URI,列名和列值的常量:

ContactsContract.Contacts表: - 表示基於原始聯繫人行的聚合的不同人的行。

ContactsContract.RawContacts表 - - 行包含個人數據的摘要,特定於用戶帳戶和類型。

ContactsContract.Data表 - - 包含原始聯繫人詳細信息(例如電子郵件地址或電話號碼)的行。

瞭解更多信息click

+0

假設我想獲取應用程序用來打開聊天意圖的id,比如viber,我該怎麼做?例如,如果Viber有一個聯繫人X,它有一些ID Y,它用於打開與此聯繫人聊天的意圖,使用:intent = new Intent(Intent.ACTION_VIEW,Uri.parse(「content:/ /com.android.contacts/data/"+id)); intent.setPackage( 「com.viber.voip」); – 2016-03-14 11:53:46

+0

請參閱此鏈接http://stackoverflow.com/a/35453979/4395114 – 2016-03-14 12:17:21

+0

我無法找到所需的ID。你能幫忙嗎?我在這裏發佈了一篇文章:http://stackoverflow.com/q/35972329/878126 – 2016-03-14 13:50:55

相關問題