需求
由于项目需要所以在app登录之后都有获取一份本地的通讯录然后上传到服务器。但是最近后台的小伙伴一直反馈说如果每次前端都把整个的通讯录上传过去,然后后台再做比较、去重、再插入数据库的话这样给服务器的压力会比较大。仔细一想其实也是,如果用户的通讯录没有改变那么上诉的所有操作都是白费的。
于是我们前端要做到除了用户第一次全部上传外,以后只有在通讯录发生改变的时候才上传修改的部分通讯录。
为了实现以上的需求我们需要实现下面几个功能:
首次登录上传全部通讯录,然后保存通讯录到本地数据库中
监听联系人是否改变
如果联系人发生改变,获取到改变后的联系人和之前保存在本地的做比较得到改变后的,然后上传服务器
首次全部上传,并且保存到本地数据库中
第一次上传的时候获取全部联系人数据,上传完成后保存到greenDao中,这里主要记录连个字段,RawContacts._ID和RawContacts.VERSION。
RawContacts._ID:用于判断这个联系人之前是否存在
RawContacts.VERSION:当新创建一个联系人的时候version的默认值为2,以后每修改一次就增加1,所以它是判断联系人是否修改的关键
ContentResolver _contentResolver = getContentResolver();
Cursor cursor = _contentResolver.query(
ContactsContract.RawContacts.CONTENT_URI, null, null, null,
null);
//清空本地数据库
oldContactLists.clear();
DBHelper.getInstance().getContact2Dao().deleteAll();
while (cursor.moveToNext()) {
Long contactID = cursor.getLong(cursor
.getColumnIndex(ContactsContract.RawContacts._ID));
long contactVersion = cursor.getLong(cursor
.getColumnIndex(ContactsContract.RawContacts.VERSION));
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
Contact2 contact2 = new Contact2();
contact2.vesion = contactVersion;
contact2.name = name;
contact2.phone = getPhoneNumber(contactID);
contact2.contactID = contactID;
contact2.cid = MyApplication.userAllInfo.cid;
oldContactLists.add(contact2);
}
cursor.close();
upLoad(oldContactLists);
下面是模拟上传代码成功后保存通讯录到greenDao中:
Log.e("+++","上传成功");
Contact2Dao contact2Dao = DBHelper.getInstance().getContact2Dao();
for (int i = 0; i < removeDuplicateContactLists1.size(); i++) {
Log.e("+++","上传了:"+removeDuplicateContactLists1.get(i).name+" "+removeDuplicateContactLists1.get(i).phone);
contact2Dao.insert(removeDuplicateContactLists1.get(i));
}
接下来开始就是要开启一个service去监听联系人的变化
在service启动的时候:
getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, contactObserver);
/**
* 监听通讯录变化
*/
private ContentObserver contactObserver = new ContentObserver(new Handler()) {
@Override
public boolean deliverSelfNotifications() {
return super.deliverSelfNotifications();
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
boolean needUpdate = isContactChanged();
if (needUpdate) {
upLoad(newContactLists);
getContentResolver().unregisterContentObserver(contactObserver);
needUpdate = false;
}
}
};