0

我正在編寫一個應用程序來與我的服務器同步聯繫人詳細信息。爲此,我需要多次查詢使用內容提供者的聯繫人,因爲所有數據都不在一個表中。例如,通過使用聯繫人ID,我必須單獨查詢每個聯繫人的電話,電子郵件和地址表,我覺得這些聯繫人效率不高。如果有人能夠指出我在單個查詢中獲取所有聯繫人詳細信息的方法,這將非常有幫助。在此先感謝:)訪問android聯繫人的所有詳細信息的最佳方式

回答

0

如果您有rawContactId,則不需要多次查詢。您可以將Data.CONTENT_URI作爲uri進行單個查詢,並在rawContactId上進行選擇。

您必須循環顯示光標才能讀取信息。要知道在至極列,你需要看到一個給定行中,你需要檢查MIMETYPE

編輯數據表

private interface DataQuery { 
    public static final String[] PROJECTION = new String[] { Data._ID, Data.MIMETYPE, Data.DATA1, Data.DATA2, Data.DATA3, }; 

    public static final int COLUMN_ID = 0; 
    public static final int COLUMN_MIMETYPE = 1; 
    public static final int COLUMN_DATA1 = 2; 
    public static final int COLUMN_DATA2 = 3; 
    public static final int COLUMN_DATA3 = 4; 
    public static final int COLUMN_PHONE_NUMBER = COLUMN_DATA1; 
    public static final int COLUMN_PHONE_TYPE = COLUMN_DATA2; 
    public static final int COLUMN_GIVEN_NAME = COLUMN_DATA2; 
    public static final int COLUMN_FAMILY_NAME = COLUMN_DATA3; 

    public static final String SELECTION = Data.RAW_CONTACT_ID + "=?"; 
} 


final Cursor c = resolver.query(Data.CONTENT_URI, DataQuery.PROJECTION, DataQuery.SELECTION, new String[] { String.valueOf(rawContactId) }, null); 

try { 
    while (c.moveToNext()) { 
     final long id = c.getLong(DataQuery.COLUMN_ID); 
     final String mimeType = c.getString(DataQuery.COLUMN_MIMETYPE); 
     uri = ContentUris.withAppendedId(Data.CONTENT_URI, id); 

     if (mimeType.equals(StructuredName.CONTENT_ITEM_TYPE)) { 
      final String oldLastName = c.getString(DataQuery.COLUMN_FAMILY_NAME); 
      final String oldFirstName = c.getString(DataQuery.COLUMN_GIVEN_NAME); 
      //store them where you need 
     } else if (mimeType.equals(Phone.CONTENT_ITEM_TYPE)) { 
      final int type = c.getInt(DataQuery.COLUMN_PHONE_TYPE); 
      final String cellPhone = c.getString(DataQuery.COLUMN_PHONE_NUMBEIR); 
      //store them where you need 
      } 
     } 
    } // while 
} finally { 
    if (c!=null) c.close(); 
} 

請考慮,我沒有檢查代碼:我不知道在這裏有一個編譯器。我希望它會有用無論如何

+0

嗨herschel。謝謝回覆。你的意思是說我可以使用Data.CONTENT_URI在單個查詢中獲得電子郵件,電話和地址嗎?如果是的話,你可以進一步解釋一下它是如何做到的?再次感謝 :) – iPhoneCoder 2011-12-19 06:46:06

0

Data是一個通用的表,可以容納任何種類的聯繫人數據

存儲在給定行中的數據類型由行的MIMETYPE值指定,該值決定了通用列DATA1至DATA15的含義。

例如,如果數據類型爲Phone.CONTENT_ITEM_TYPE,則DATA1列存儲電話號碼,但如果數據類型爲Email.CONTENT_ITEM_TYPE,則DATA1存儲電子郵件地址。同步適配器和應用程序可以引入它們自己的數據種類。

相關問題