不,你是不是對任何錯誤的邊緣。 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();
}
}
是的,這完全嚴肅的解決方案並使用字符串比較。如果有更好的方法,請告訴我!
哇,多麼奇怪的說。懺悔:在等待這個答案之前,我給了我自己的聯繫人表。我的功能更短,更優雅;我寫的助手班已經被淘汰;我的代碼看起來好多了。我相信它也更有效率。感謝您的幫助和答案。 –
我會這樣做..只要觀察聯繫人並將其導入到您自己的數據庫中,如果您有一個複雜的問題需要解決,那麼您實際上可以使用SQL! –
我想你可以改善你的代碼,但它仍然非常清楚,非常有幫助。非常感謝! – gor