У меня есть приложение «Контакты», и мне нужно обновить локальную базу данных ORMLite с помощью ContentObserver. Мне нужно проверить обновления контактов. И если это так, мне нужно обновить имя контакта, если оно не хранится в моей локальной базе данных.
У меня есть два элемента - CallItem (у которого есть внешнее поле Contact) и ContactItem.
Мой ContentObserver:
class CallsContentObserver extends ContentObserver {
Context _context;
Handler _handler;
public CallsContentObserver(Handler handler, Context context) {
super(handler);
this._context = context;
this._handler = handler;
}
@Override
public boolean deliverSelfNotifications() {
return true;
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
ArrayList<CallItem> contactsList = null;
DatabaseHandler db = new DatabaseHandler(getApplicationContext());
Cursor contactLookupCursor = null;
try{
Dao<CallItem,Integer> daoSubject = db.getCallDao();
contactsList = (ArrayList<CallItem>) daoSubject.queryForAll();
for (CallItem contact : contactsList)
{
if (contact.getCall_contact() == null)
{
String contactNumber = Uri.encode(contact.getNumber());
String new_name = null;
contactLookupCursor =getContentResolver().query(
Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,contactNumber),
new String[] {PhoneLookup.DISPLAY_NAME, PhoneLookup._ID}, null, null, null);
while(contactLookupCursor.moveToNext()){
new_name = contactLookupCursor.getString(contactLookupCursor.getColumnIndexOrThrow(PhoneLookup.DISPLAY_NAME));
}
contactLookupCursor.close();
contact.setName(new_name);
daoSubject.update(contact);
}
}
}
catch(Exception e)
{e.printStackTrace();}
finally{db.close();}
}
}
поэтому я получил все свои CallItems. Затем я проверяю, содержит ли каждый CallItem ContactItem, если нет, я получаю новое имя по его номеру и обновляю этот CallItem новым значением с помощью DAO. Но это решение довольно медленное, я хочу сделать его более плавным. Как я могу это сделать?