1.先说说原理,大家知道,android可以对数据库进行监控,但是个人感觉这个监控不给力,无论怎么实现监控,最后返回的结果是数据库是否改变,没有告诉我们数据库的那条数据进行了改变或者是删除,添加,并不能解决大多数需求。
当初我遇到这样的问题我也很痛苦,无论怎么早资料都没找到自己想要的,而网上大多数资料只是告诉你怎么监控数据库,但没有告诉你怎么获取具体的数据改变。
往往成功是逆境里逼出来的,我去查找英文API,发现ContactsContract.RawContacts类中VERSION字段的说明,原文如下:
Version number that is updated whenever this row or its related data changes. This field can be used for optimistic locking of a raw contact.
中文大概意思就是,只要是联系人相关属性只要进行修改了都会自加。
有了这个说明,我自己对android虚拟机上的联系人进行测试,然后把sqlit数据库导出进行查看,发现VERSION确实发生了改变。有了这个依据,便能很好的解决监听联系人数据变化了。
我的设计思路是这样,当用户第一次启动程序,程序就遍历RawContacts,将所有_id和VERSION组合成字符串,然后用SharedPreferences存入。
这样再监听数据库,当数据库有改变时,数据进行对比,就知道哪些数据进行了修改,如果SharedPreferences数据不存在说明有增加,如果SharedPreferences数据大于原有数据库的数据说明有增加。
2.ContactsContract.Contacts.CONTACT_STATUS_TIMESTAMP
3.官方的api的demo,详细位置,Apidemo/Content/Provider/Changed Contacts
4.getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, mObserver);