2017-01-30 128 views
1

我一直在嘗試編寫一個通過服務器同步聯繫人的android程序。我已經實現了同步部分現在,我想維護差異部分,例如只有那些自上次服務器推送可能在下次服務器調用中被更新後更新的聯繫人。 我正在使用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時間戳也被更新。

如果你不關心這兩個值,那麼你從這個取得了聯繫,最後聯繫方式,以及新的DIFF之間,而如果沒有這是很重要的,你變化領域的,跳過聯繫。

UPDATE

爲了避免存儲在一個應用程序本地數據庫中的所有聯繫人的所有細節,就可以計算出一個散列值(單長整型),表示當前保存的聯繫人的領域,如果最近更新的聯繫人的新哈希值與之前的哈希值不同,您知道聯繫人已被修改(在您關心的字段上),並且您需要同步該聯繫人。

見到這對如何在Java對象計算好的哈希值:Java: Getting a unique hash value of an object

+0

爲了這個,我不得不保持在我的Android新的數據庫,其中存儲所有的聯繫人,因爲我正在使用的代碼作爲後臺服務在我的應用程序中,我認爲這將是非常低效的。 –

+0

所有你需要存儲的是一個哈希值。我會將其添加到我的答案 – marmor

相關問題