以编程方式获取Android中联系人的上次更新时间
我一直在尝试编写一个android程序,通过服务器同步联系人。我已经实现了同步部分,现在我想维护差异部分,例如,只有那些自上次服务器推送以来已更新的联系人可能在下一次服务器调用中被推送。 我正在使用Contacts contract.Contacts.CONTACT\u LAST\u UPDATED\u时间戳监视联系人的上次更新时间戳。它还可以正常工作,因为它告诉我何时更新了联系人,但有一个问题,每当我给任何联系人打电话时,它的联系人\u上次\u更新\u时间戳也会更新,就好像联系人现在已被修改一样。我不想发生这种事。我想要的确切的最后更新时间的联系,只或通过任何其他方式来处理上述情况。欢迎提出建议。这是我的密码以编程方式获取Android中联系人的上次更新时间,android,contactscontract,Android,Contactscontract,我一直在尝试编写一个android程序,通过服务器同步联系人。我已经实现了同步部分,现在我想维护差异部分,例如,只有那些自上次服务器推送以来已更新的联系人可能在下一次服务器调用中被推送。 我正在使用Contacts contract.Contacts.CONTACT\u LAST\u UPDATED\u时间戳监视联系人的上次更新时间戳。它还可以正常工作,因为它告诉我何时更新了联系人,但有一个问题,每当我给任何联系人打电话时,它的联系人\u上次\u更新\u时间戳也会更新,就好像联系人现在已被修改一
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();
}
String phoneNumber=null;
String _ID=Contacts contact.Contacts.\u ID;
String DISPLAY\u NAME=Contacts contract.Contacts.DISPLAY\u NAME;
字符串Phone\u CONTACT\u ID=contacts contract.commondatatypes.Phone.CONTACT\u ID;
字符串CONTACT\u LAST\u UPDATED\u TIMESTAMP=Contacts contract.Contacts.CONTACT\u LAST\u UPDATED\u TIMESTAMP;
String Contact\u last=contacts contract.commondatatypes.Phone.Contact\u last\u UPDATED\u时间戳;
字符串编号=contacts contract.commonDataTypes.Phone.NUMBER;
ContentResolver ContentResolver=appContext.getContentResolver();
Cursor Cursor=contentResolver.query(CONTENT\u URI,null,null,null);
ArrayList联系人=新建ArrayList();
if(cursor!=null&&cursor.moveToFirst()&&cursor.getCount()>0){
做{
long activity_at=cursor.getLong(cursor.getColumnIndex(CONTACT_LAST_UPDATED_TIMESTAMP));
如果(活动_at在您呼叫(或接收)联系人时,以下值:
,
改变
因此,实际上,联系人
在数据库中更新,因此其上次更新的时间戳也会更新
如果您不关心这两个值,则将此联系人的上一个联系人详细信息与新联系人详细信息区分开来,如果对您重要的字段均未更改,则跳过该联系人
更新
为了避免在应用程序本地数据库中存储所有联系人的所有详细信息,您可以计算一个散列值(单个长整数),该散列值表示当前为联系人保存的字段。如果最近更新的联系人的新散列值与前一散列值不同,则您知道该联系人已被修改(在您关心的字段上),并且您需要同步该联系人
关于如何在Java对象上计算好的散列值,请参见以下内容:为此,我必须在android中维护一个新的数据库,该数据库存储所有联系人,并且由于我在应用程序中将该代码用作后台服务,我想这将是非常低效的。您只需要存储一个散列值。我将它添加到answerIn API级别29 c中onstant已被弃用。