Предложения по улучшению кода:
0) Добавить проекцию в ваш код => получение всех столбцов неэффективно
String[] projection = new String[] { ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.PhoneLookup.TYPE};
И чем добавить прогноз к вашему запросу:
Cursor cur = cr.query(ContactsContract.Data.CONTENT_URI,
projection, null, null, null);
1) В вашем цикле вы получаете индекс столбца на каждой итерации. Нет необходимости перемещать cur.getColumnIndex из цикла.
2) При работе с курсором вы можете дополнить цикл for циклом while-condition. Вот предложение импл. вашего метода getContacts ():
// A list of providers imports used!
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts.Data;
public void getContacts(){
ContentResolver cr = getContentResolver();
String[] projection = new String[] { Data._ID,
ContactsContract.Contacts.DISPLAY_NAME, Phone.TYPE};
Cursor cur = cr.query(ContactsContract.Data.CONTENT_URI,
projection, null, null, null);
// don't use this ContentProvider
// Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
// projection, null, null, null);
if (cur != null && cur.moveToFirst()) {
try {
int indexID = cur.getColumnIndexOrThrow(ContactsContract.Contacts._ID);
int indexName = cur.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME);
int indexPhoneType = cur.getColumnIndexOrThrow(Phone.TYPE);
while (cur.moveToNext()) {
//do your logic here;
String id = cur.getString(indexID);
String name = cur.getString(indexName);
String phoneType = cur.getString(indexPhoneType);
}
} catch (SQLException sqle) {
//handle exception here - like missing column name!
} finally { //close your cursor if it's not needed!
if (!cur.isClosed()) {
cur.close();
}
}
}
}
EDIT:
Использовать этот импорт:
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts.Data;
Используйте эту проекцию
String[] projection = new String[] { ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.PhoneLookup.TYPE};
Используйте этот запрос:
Crsor cur = cr.query(ContactsContract.Data.CONTENT_URI,
projection, null, null, null);
Использовать имена столбцов:
int indexID = cur.getColumnIndexOrThrow(ContactsContract.Contacts._ID);
int indexName = cur.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME);
int indexPhoneType = cur.getColumnIndexOrThrow(Phone.TYPE);