いいえ、あなたは何か悪いことをしているわけではありません。Contacts ContentProvider (および私が見たほぼすべての ContentProvider) は、従来の SQL の知恵と矛盾しています。
複数のタイプの ContactsContracts.CommonDataKinds からデータを取得する場合は、現在の行の MIME タイプを検出し、それがどの種類のエンティティであるかを判断する必要があります (または、追加のクエリを作成します。私の推奨する解決策は、それはすべて1つのクエリで...)
息を止めてください。これは、そのようなことを行うために私が書いたコードの例です。さまざまな行がさまざまな種類のエンティティである可能性があり、その結果として、それらのジェネリック列がさまざまな種類のデータを保持できることを確認できるはずです。これが、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();
}
}
はい、この完全に深刻な解決策は文字列比較を使用します。もっと良い方法があれば教えてください!