Я выполняю итерацию через таблицу Contacts
, и каждая итерация делает итерацию на столе Phone
, поэтому она принимает приложение. 4 секунды, чтобы сделать список контактов для 243 контактов (без повторного набора номеров телефонов, которые он загружает мгновенно). Я уверен, что есть способ сделать это быстрее.Как я могу сделать этот запрос ContactsContract.Contact быстрее с помощью внутреннего запроса CommonDataKinds.Phone?
Уже сделаны прогнозы для получения только необходимых столбцов, но они не улучшились. Может быть, я должен улучшить SQLite запрос или итерацию каким-либо другим способом:
Contact realmContact = new Contact();
Uri uri = Contacts.CONTENT_URI;
String[] projection = {
Contacts.LOOKUP_KEY,
Contacts.DISPLAY_NAME_PRIMARY,
Contacts.LAST_TIME_CONTACTED,
Contacts.HAS_PHONE_NUMBER
};
String selection = "((" + CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY + " NOTNULL) AND ("
+ Contacts.HAS_PHONE_NUMBER + "=1) AND ("
+ CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY + " != ''))";
Cursor phones = getActivity()
.getContentResolver()
.query(uri, projection, selection, null, null);
while (phones.moveToNext()) {
String id = phones.getString(phones.getColumnIndex(Contacts.LOOKUP_KEY));
String name = phones.getString(phones.getColumnIndex(Contacts.DISPLAY_NAME_PRIMARY));
String lastTimeContacted = phones.getString(phones.getColumnIndex(Contacts.LAST_TIME_CONTACTED));
long data = Long.parseLong(lastTimeContacted);
String date = new SimpleDateFormat("dd/MM/yyyy | HH:mm").format(new Date(data));
if (Integer.parseInt(phones.getString(phones.getColumnIndex(Contacts.HAS_PHONE_NUMBER))) > 0) {
Cursor pCur = getActivity().getContentResolver().query(
CommonDataKinds.Phone.CONTENT_URI,
new String[]{CommonDataKinds.Phone.NUMBER},
CommonDataKinds.Phone.LOOKUP_KEY + " = ?",
new String[]{id}, null);
int iterationCounter = 0;
String phoneNumber = "";
while (pCur.moveToNext()) {
phoneNumber += iterationCounter == 0 ?
pCur.getString(pCur.getColumnIndex(CommonDataKinds.Phone.NUMBER))
: "," + pCur.getString(pCur.getColumnIndex(CommonDataKinds.Phone.NUMBER));
iterationCounter += 1;
}
realmContact.setNumber(phoneNumber);
Log.i("asd-number", phoneNumber);
pCur.close();
}
realmContact.setId(id);
realmContact.setName(name);
realmContact.setLastTimeContacted(
getActivity().getResources()
.getString(R.string.contacts_list_fragment_last_call)
+ date);
realmContact.setIsBeingSaved(true);
_realm.insertOrUpdate(realmContact);
просто перебрать курсором для 'CommonDataKinds. Phone.CONTENT_URI' – pskink
у них нет столбца 'display_name' –
да у них есть:' ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME' – pskink