我一直在尝试编写一个通过服务器同步联系人的android程序。我已经实现了同步部分现在我想维护差异部分,例如只有那些已经更新的联系人,因为上一次服务器推送可能会在下一次服务器调用中被推送。 我正在使用ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP来关注最近更新的联系人时间戳。它也正常工作,因为它告诉我联系人何时更新但是有一个问题,每当我对任何联系人进行任何调用时,它的CONTACT_LAST_UPDATED_TIMESTAMP也会更新,就像现在已经修改了联系人一样。我不希望这种情况发生。我想要确切的最后更新联系时间或通过任何其他方式来接近上述情况。欢迎提出建议。这是我的代码
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是一个变量,它具有前一天的时间戳,即从昨天到今天更新的联系人应该被推送到服务器
答案 0 :(得分:2)
当您致电(或接听来自)联系人时,其值为: ContactsContract.Contact.TIMES_CONTACTED, ContactsContract.Contact.LAST_TIME_CONTACTED 变化
事实上,Contact
在数据库中已更新,因此其LAST_UPDATED
时间戳也会更新。
如果您不关心这两个值,那么在您从此联系人获得的最后一个联系人详细信息与新联系人之间进行区分,如果没有任何字段对您很重要已更改,跳过该联系人。
<强>更新强>
为避免在应用程序本地数据库中存储所有联系人的所有详细信息,您可以计算一个哈希值(单个长整数),表示当前为联系人保存的字段,如果最近更新的新哈希值联系人与之前的哈希值不同,您知道联系人已被修改(在您关注的字段上),并且您需要同步该联系人。
请参阅以下有关如何计算Java对象的良好哈希值的信息:Java: Getting a unique hash value of an object