开发者社区> 技术小胖子> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

完美解决android监听联系人数据变化

简介:
+关注继续查看
先说说原理,大家知道,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数据大于原有数据库的数据说明有增加。

首先我先放上一段JAVA的demo展现思路。android代码稍后放上,如有疑问或者有什么不对,请大家指教。

public class ContactJianTing
{
public static void main(String args[])
{
init();
String str = "1-2";
String a[] =str.split("-");
for (String string : a)
{
System.out.println(string);
}
}
private static void init()
{
HashMap<String, String> a = new HashMap<String, String>();
HashMap<String, String> b = new HashMap<String, String>();
for (int key = 1; key <= 1000; key++)
{
a.put(String.valueOf(key), String.valueOf(key));
b.put(String.valueOf(key), String.valueOf(key+1));
}
Set<String> aSet = a.keySet();
for (String string : aSet)
{
System.out.println(string);
}
long start = System.currentTimeMillis();
for(int i = 1;i<=1000;i++)
{
System.out.println("号码 "+i);
if(!a.get(String.valueOf(i)).equals(b.get(String.valueOf(i))))
{
System.out.println("数据不同");
}
System.out.println("-----------");
}
long end = System.currentTimeMillis();
long sum = end - start;
System.out.println("总共耗时"+sum);
}
}

在没有连接数据库的情况下,使用HashMap,1000条数据耗时40毫秒左右。对于用户而言,拥有1000个联系人的手机毕竟少之又少。




     本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/1230804,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android SQLite 使用 query 查询特定行数据
Android SQLite 使用 query 查询特定行数据
0 0
android retrofit 请求返回String数据中文乱码解决方案
问题来源 focus 应用中核心的部分是,网络请求订阅的xml文件内容,然后解析xml文件存储到本地数据库。
0 0
嵌入式实践教程--Android音视频开发(二)-OpenSLES播放PCM数据
嵌入式实践教程--Android音视频开发(二)-OpenSLES播放PCM数据
0 0
Android 天气APP(二十七)增加地图天气的逐小时天气、太阳和月亮数据
Android 天气APP(二十七)增加地图天气的逐小时天气、太阳和月亮数据
0 0
Android 天气APP(二十五)地图天气(下)嵌套滑动布局渲染天气数据
Android 天气APP(二十五)地图天气(下)嵌套滑动布局渲染天气数据
0 0
Android 天气APP(二十一)滑动改变UI、增加更多天气数据展示,最多未来15天天气预报
Android 天气APP(二十一)滑动改变UI、增加更多天气数据展示,最多未来15天天气预报
0 0
Android 天气APP(二十二)改动些许UI、增加更多空气质量数据和生活建议数据展示
Android 天气APP(二十二)改动些许UI、增加更多空气质量数据和生活建议数据展示
0 0
Android 天气APP(二十)增加欢迎页及白屏黑屏处理、展示世界国家/地区的城市数据
Android 天气APP(二十)增加欢迎页及白屏黑屏处理、展示世界国家/地区的城市数据
0 0
Android 天气APP(十)继续优化、下拉刷新页面天气数据
Android 天气APP(十)继续优化、下拉刷新页面天气数据
0 0
Android基础入门:EventBus实现总线数据分发
我们之前学习了Activity-》Activity中的数据传送,是通过intent.putExtra()方法实现的,如果要实现Activity-》Fragment或者Fragment-》Fragment都是不方便的,通过EventBus能很好的解决这个问题
0 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Android组件化实现
立即下载
蚂蚁聚宝Android秒级编译—— Freeline
立即下载
Android插件化:从入门到放弃
立即下载