сделать базу данных ORMLite с помощью ContentObserver свободно

У меня есть приложение «Контакты», и мне нужно обновить локальную базу данных 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. Но это решение довольно медленное, я хочу сделать его более плавным. Как я могу это сделать?


person Rikki Tikki Tavi    schedule 08.10.2013    source источник
comment
Вы придумали какие-нибудь решения для этого чувака?   -  person Gray    schedule 19.12.2013


Ответы (1)


Я нашел решение для этого. Я не анализирую весь журнал вызовов, когда пользователь впервые появляется в приложении. Я анализирую только первые 20 вызовов, а затем загружаю больше с помощью onScroll. Таким образом, обработка и синхронизация имен с локальной базой данных занимает не так много времени.

ORMLite довольно хорош, тем не менее я считаю, что в этих случаях лучше использовать ContentResolver.

person Rikki Tikki Tavi    schedule 19.12.2013
comment
Интересный. Дайте мне знать, если это базовый класс, чтобы помочь с ContentResolver материалом в ORMLite. - person Gray; 19.12.2013