2012-06-16 14 views
1

我覺得好像我可能缺少ContactsContract API中的東西沒有什麼好辦法。在我的應用程序中,我有幾個SQLite表,引用了Contacts或Groups(來自ContactsContract API)。我這樣做,而不是用我自己的聯繫人和組表格重新發明輪子。然而Android和SQLite的:有沒有加入查詢與ContactsContract API

使得查詢攜手合作正在變成一場噩夢。假設我想使用來自特定組的所有聯繫人對我的SQL表執行操作。我在查詢ContactsContract得到一個組的成員的CONTACT_ID的,加盟者CONTACT_ID的成字符串,然後把該字符串轉換成一個單獨的查詢。 (或者在一個循環中有SQL查詢)。

這是一個糟糕的SQL,我覺得我必須做錯某些事情,但我找不到其他任何方法的參考。我正在維護我自己的聯繫人列表。有任何想法嗎?

回答

3

不,你是不是對任何錯誤的邊緣。 Contacts ContentProvider(以及我見過的幾乎每個ContentProvider)與傳統的SQL智慧相矛盾。

如果你想從多種類型的ContactsContracts.CommonDataKinds中獲取數據,你需要檢測你所在行的MIME類型,並確定它是什麼類型的實體(或者創建一個額外的查詢,我的首選解決方案是在一個查詢中完成所有操作...)

屏住呼吸,這裏是我寫的一些代碼來做這樣的事情的一個例子。您應該能夠看到不同行可以是不同類型的實體,並且由於它們的通用列可以保存不同類型的數據,這就是爲什麼我們使用CommonDataKinds。*類來根據上下文引用它們:

public class ContactsHelper { 


    private static String[] PROJECTION = { 
     Data.CONTACT_ID, 
     Data.MIMETYPE, 
     StructuredName.GIVEN_NAME, 
     StructuredName.FAMILY_NAME, 
     StructuredName.DISPLAY_NAME, 
     StructuredName.MIDDLE_NAME, 
     Email.ADDRESS 
    }; 

    public static void readContacts(Context context) { 
     ContentResolver resolver = context.getContentResolver(); 
     Uri contactsUri = ContactsContract.Data.CONTENT_URI; 

     SQLiteDatabase conn = DatabaseHelper.openDatabase(context); 

     Cursor cursor = resolver.query(contactsUri, PROJECTION, null, null, null); 

     int idxContactId = cursor.getColumnIndex(Data.CONTACT_ID); 
     int idxMimeType = cursor.getColumnIndex(Data.MIMETYPE); 
     int idxGivenName = cursor.getColumnIndex(StructuredName.GIVEN_NAME); 
     int idxFamilyName = cursor.getColumnIndex(StructuredName.FAMILY_NAME); 
     int idxDisplayName = cursor.getColumnIndex(StructuredName.DISPLAY_NAME); 
     int idxMiddleName = cursor.getColumnIndex(StructuredName.MIDDLE_NAME); 
     int idxEmail = cursor.getColumnIndex(Email.ADDRESS); 

     for (cursor.moveToFirst(); ! cursor.isAfterLast(); cursor.moveToNext()) { 
      String mimeType = cursor.getString(idxMimeType); 

      Integer contactId = cursor.getInt(idxContactId); 

      if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) { 
       String firstName = cursor.getString(idxGivenName); 
       String middleName = cursor.getString(idxMiddleName); 
       String lastName = cursor.getString(idxFamilyName); 
       String displayName = cursor.getString(idxDisplayName); 

          Log.d(TAG, all the values ^^^); 

      } 


      if (Email.CONTENT_ITEM_TYPE.equals(mimeType)) { 
       String emailName = cursor.getString(idxEmail); 
       Log.d(TAG, all the values ^^^); 
      } 
     } 

     DatabaseHelper.closeDatabase(conn); 
     cursor.close(); 
    } 
} 

是的,這完全嚴肅的解決方案並使用字符串比較。如果有更好的方法,請告訴我!

+0

哇,多麼奇怪的說。懺悔:在等待這個答案之前,我給了我自己的聯繫人表。我的功能更短,更優雅;我寫的助手班已經被淘汰;我的代碼看起來好多了。我相信它也更有效率。感謝您的幫助和答案。 –

+1

我會這樣做..只要觀察聯繫人並將其導入到您自己的數據庫中,如果您有一個複雜的問題需要解決,那麼您實際上可以使用SQL! –

+0

我想你可以改善你的代碼,但它仍然非常清楚,非常有幫助。非常感謝! – gor