2017-01-30 12 views
1

Я пытался написать программу для Android, которая синхронизирует контакты по серверу. Я получил часть синхронизации. Теперь я хочу сохранить часть diff, такую ​​как только те контакты, которые были обновлены, так как последнее нажатие на сервер может быть нажато в следующем вызове сервера. Я использую ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP, чтобы следить за последней обновленной меткой контактов. Он также работает правильно, поскольку он сообщает мне, когда контакт был обновлен. Но возникает проблема, когда я обращаюсь к любому контакту, это CONTACT_LAST_UPDATED_TIMESTAMP также обновляется, как если бы контакт был изменен. Я не хочу, чтобы это произошло. Я хочу точно обновить время контактов только или любыми другими способами, чтобы подойти к вышеуказанной ситуации. Предложения приветствуются. Вот мой кодПоследнее обновление Время контактов в Android программно

String phoneNumber = null; 

     String _ID = ContactsContract.Contacts._ID; 
     String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME; 


     String Phone_CONTACT_ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID; 
     String CONTACT_LAST_UPDATED_TIMESTAMP = ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP; 
     String Contact_last = ContactsContract.CommonDataKinds.Phone.CONTACT_LAST_UPDATED_TIMESTAMP; 
     String NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER; 
     ContentResolver contentResolver = appContext.getContentResolver(); 
     Cursor cursor = contentResolver.query(CONTENT_URI, null, null, null, null); 

     ArrayList<Contact> contacts = new ArrayList<>(); 

     if (cursor!= null && cursor.moveToFirst() && cursor.getCount() > 0) { 
      do { 

       long activity_at = cursor.getLong(cursor.getColumnIndex(CONTACT_LAST_UPDATED_TIMESTAMP)); 
       if(activity_at <= prevActivityTime) { 

        continue; 
       } 
       // Create a contact object 
       Contact contact = new Contact(); 

       // Fetch contact id and contact name 
       String contact_id = cursor.getString(cursor.getColumnIndex(_ID)); 
       String contactName = cursor.getString(cursor.getColumnIndex(DISPLAY_NAME)); 






      } while (cursor.moveToNext()); 
      cursor.close(); 
     } 

здесь preActivityAt это переменная, которая имеет метку времени предыдущего дня т.е. контактов обновляется со вчерашнего дня до сегодняшнего дня должны получить толкнул на сервер

ответ

2

При вызове (или при получении вызова от) контакта , значения по адресу: ContactsContract.Contact.TIMES_CONTACTED, ContactsContract.Contact.LAST_TIME_CONTACTED изменение.

Таким образом, в базе данных обновляется Contact, и поэтому его временная метка LAST_UPDATED также обновляется.

Если вы не заботитесь обо всех этих двух значениях, то разницу между последней контактной информацией, полученной вами от этого контакта, и новыми, и если ни одно из полей , которые для вас не важны, измените, пропустите это контакт.

UPDATE

Чтобы избежать хранений всех деталей для всех контактов в приложении локальной БД, можно вычислить хэш-значение (один длинное целое), которые представляют поля, сохраненные для контакта, если новое значение хэша для недавно обновленного контакта отличается от предыдущего хеш-значения, вы знаете, что контакт был изменен (по интересующим вас полям) и что вам нужно синхронизировать этот контакт.

Смотрите это о том, как рассчитать хорошие значения хэш-функции на Java объектов: Java: Getting a unique hash value of an object

+0

для этого я должен был поддерживать новую базу данных в моем андроида, который хранит все контакты и с тех пор я использую код в качестве фонового сервиса в моем приложении, я думаю, что это будет довольно неэффективно. –

+0

все, что вам нужно сохранить, это хешированное значение. я добавлю его в свой ответ – marmor

 Смежные вопросы

  • Нет связанных вопросов^_^