2017-01-30 2 views
1

Ich hatte versucht, ein Android-Programm zu schreiben, die Kontakte über den Server synchronisieren. Ich habe den Synchronisierungsteil erreicht Nun möchte ich den Diff-Teil beibehalten, so wie nur die Kontakte, die seit dem letzten Server-Push aktualisiert wurden, beim nächsten Server-Aufruf gedrängt werden. Ich verwende den ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP, um den letzten aktualisierten Zeitstempel der Kontakte im Auge zu behalten. Es funktioniert auch korrekt, da es mir sagt, wenn der Kontakt aktualisiert wurde. Aber es gibt ein Problem, wenn ich irgendeinen Kontakt anrufe, wird CONTACT_LAST_UPDATED_TIMESTAMP auch aktualisiert, als ob der Kontakt jetzt geändert worden wäre. Ich möchte nicht, dass das passiert. Ich möchte die genau letzte aktualisierte Zeit der Kontakte nur oder auf andere Weise, um die obige Situation zu nähern. Vorschläge sind willkommen. Hier ist mein CodeLetzte Aktualisierung der Zeit der Kontakte in Android programmgesteuert

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(); 
     } 

hier preActivityAt ist eine Variable, die von gestern aktualisierten Zeitstempel Vortages dh Kontakte hat bis heute an den Server geschoben bekommen sollte

Antwort

2

Wenn Sie anrufen (oder einen Anruf von empfangen) einen Kontakt , die Werte unter: ContactsContract.Contact.TIMES_CONTACTED, ContactsContract.Contact.LAST_TIME_CONTACTED ändern.

In der Tat ist die Contact in der DB aktualisiert, und daher wird der LAST_UPDATED Zeitstempel auch aktualisiert.

Wenn Sie sich nicht um diese beiden Werte kümmern, dann diff zwischen den letzten Kontaktdetails, die Sie von diesem Kontakt erhalten haben, und den neuen, und wenn keines der , die für Sie wichtig sind geändert, überspringen Sie das Kontakt.

UPDATE

alle Details für alle Kontakte in einer App-lokalen DB Speicherung zu vermeiden, können Sie einen Hash-Wert (single long integer) berechnen, welche die Felder zur Zeit für einen Kontakt gespeichert darstellen, wenn Ein neuer Hashwert für einen kürzlich aktualisierten Kontakt unterscheidet sich von dem vorherigen Hashwert. Sie wissen, dass der Kontakt geändert wurde (in Feldern, die Ihnen wichtig sind) und dass Sie diesen Kontakt synchronisieren müssen.

Sehen Sie diese auf, wie gut Hash-Werte auf Java-Objekte zu berechnen: Java: Getting a unique hash value of an object

+0

für das ich eine neue Datenbank in meinem Android zu halten hatte, die alle Kontakte speichert und da ich bin mit dem Code als Hintergrunddienst in meiner App denke ich, das wäre ziemlich ineffizient. –

+0

Alles, was Sie zum Speichern benötigen, ist ein Hashwert. Ich werde es meiner Antwort hinzufügen – marmor

Verwandte Themen