Для тех, кто ранее работал с данными контактов в версиях системы ниже 2,0 переход на новую модель работы с данными старшей версии системы может показаться болезненным и не совсем логичным. Ниже я приведу фрагменты кода, которые делают примерно одно и тоже в разных версиях системы. Если раньше можно было читать данные достаточно коротким фрагментом кода, типа следующего:
// Работает в Android 1,6 // Form an array specifying which columns to return. String[] projection = new String[] { People._ID, People.NAME, People.NUMBER };
// Get the base URI for the People table in the Contacts content provider. Uri contacts = People.CONTENT_URI;
// Make the query. Cursor managedCursor = managedQuery(contacts, projection, // Which columns to return null, // Which rows to return (all rows) null, // Selection arguments (none) // Put the results in ascending order by name People.NAME + " ASC");
// Process contact data if (cur.moveToFirst()) {
String name; String phoneNumber; int nameColumn = cur.getColumnIndex(People.NAME); int phoneColumn = cur.getColumnIndex(People.NUMBER);
do { // Get the field values name = cur.getString(nameColumn); phoneNumber = cur.getString(phoneColumn); System.out.println("name: " + name + ", phone number: " + phoneNumber);
} while (cur.moveToNext()); }
то теперь для выполнения той же самой операции потребуется написать гораздо больше кода, который должен выполнить значительно больше работы:
// Работает в 2,0 private void readNewStyle() {
String phoneTypes[] = {"Home", "Mobile", "Work", "Fax work", "Fax home", "Pager", "Other", "Callback", "Car", "Company main", "ISDN", "Main", "Other fax", "Radio", "Telex", "TTY TDD", "Work mobile", "Work pager", "Assistand", "MMS"};
Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
while(cursor.moveToNext()) { String ContactID = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); System.out.println("Name: " + name + " _ID: " + ContactID); String hasPhone = cursor.getString( cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); if(hasPhone.compareTo("1") == 0) { Cursor phoneCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "='" + ContactID + "'", null, null);
while(phoneCursor.moveToNext()) { String number = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); String numberType = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)); switch(Integer.parseInt(numberType)) {
// Отбираем знакомые типы телефонных номеров case ContactsContract.CommonDataKinds.Phone.TYPE_HOME: case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE: case ContactsContract.CommonDataKinds.Phone.TYPE_WORK: case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK: case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME: case ContactsContract.CommonDataKinds.Phone.TYPE_PAGER: case ContactsContract.CommonDataKinds.Phone.TYPE_OTHER: case ContactsContract.CommonDataKinds.Phone.TYPE_CALLBACK: case ContactsContract.CommonDataKinds.Phone.TYPE_CAR: case ContactsContract.CommonDataKinds.Phone.TYPE_COMPANY_MAIN: case ContactsContract.CommonDataKinds.Phone.TYPE_ISDN: case ContactsContract.CommonDataKinds.Phone.TYPE_MAIN: case ContactsContract.CommonDataKinds.Phone.TYPE_OTHER_FAX: case ContactsContract.CommonDataKinds.Phone.TYPE_RADIO: case ContactsContract.CommonDataKinds.Phone.TYPE_TELEX: case ContactsContract.CommonDataKinds.Phone.TYPE_TTY_TDD: case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE: case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_PAGER: case ContactsContract.CommonDataKinds.Phone.TYPE_ASSISTANT: case ContactsContract.CommonDataKinds.Phone.TYPE_MMS: { System.out.println("phone number: " + number + "("+phoneTypes[Integer.parseInt(numberType)]+")"); break; }
// Для всех остальных default: { System.out.println("phone number: " + number + "(" + numberType + ")"); break; } } } phoneCursor.close(); } else { System.out.println("no phone number found"); }
Cursor emailCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, new String[] { ContactsContract.CommonDataKinds.Email.DATA, ContactsContract.CommonDataKinds.Email.TYPE}, ContactsContract.CommonDataKinds.Email.CONTACT_ID + "='" + ContactID + "'", null, null); while(emailCursor.moveToNext()) {
String emailTypes[] = {"Home", "Work", "Other", "Mobile", "Custom"}; String email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); String emailType = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); switch(Integer.parseInt(emailType)) { // Отбираем знакомые типы электронных адресов case 1: case 2: case 3: case 4: case 5: { System.out.println(emailTypes[Integer.parseInt(emailType)] + email); break; } default: { System.out.println("Not listed type: " + email); break; } } } emailCursor.close(); } cursor.close();
Стоит отметить, что проект для работы с контактами версии в стиле версии 2,0 может включать в себя код для работы в стиле 1,6 — Eclipse укажет вам на то что вызовы этих методов помечены как устаревшие и зачеркнёт их. Однако проект будет успешно собираться и работать. За вами лишь определение версии и вызов соответствующего метода длы выборки данных.
|