刚刚看了一篇IBM的博客,讲的是Android本地数据存储API,感觉实在是太复杂了,对于大部分个人开发者而言,按照这种方式来做自己的项目,实在是一件极其痛苦的事情,作为一名敏捷开发的信徒,实在难以忍受按照IBM那套来做事情,下面给大家介绍一下个人在实践中总结出来的一套数据存储的方法。
做Android本地数据的存储无非就是
1 使用SharedPreferences存储数据
2 文件存储数据
3 SQLite数据库存储数据
4 使用ContentProvider存储数据
这些方式已经被用烂了,第一个在存储用户设置比较多,第二个用在图片缓存游戏数据混村等,第三个使用数据库功能上来说是最强大的,结合一些ORM类,可以构建很丰富的应用,很多需要和服务端交互的数据都会走SQLite。
按照传统Java的习惯,对于多个对象的数据,使用SQLite是最轻松就能想到的,但使用SQLite还需要自己写一个DBHelper,这对于有多年Java数据库经验的人而言自然是很熟练,但是在实际的Android项目开发中,你需要关注UI、用户体验、产品和逻辑,很难有精力自己去实现这样一套东西,而且就算幸苦做出来,在使用的时候也会遇到各种麻烦的事情,总之在本地使用数据库真的是一件非常吃力不讨好的事情。
当然,如果单纯的使用SharedPreferences,你只能存一些键值对,这对于丰富的UI交互与数据交互的Android平台而言实在太麻烦了,我也一直在为这个问题困扰,开发Android的时候总感觉快不起来。
另外一个困扰我的问题就是对于服务端返回的JSON数据,经常需要解析,总是要实现一套JSON解析的工具,因为不同的项目和不同数据交互,处理的JSON对象往往不同,很是头疼。然而自从接触了谷歌的Gson之后,处理起JSON的效率一下就有了质的飞跃,特么原来还有这么爽的工具,做梦都要笑醒了。
再回过头看看Android客户端的本地数据缓存,再看看JSON数据,我便拿起Gson,将对象变成JSON String存到了SharedPreferences里面,取用的时候把JSON String用Gson实例化为对象,立刻就能在UI层面上setText(user.name)了,还有比这更爽的方式吗?
下面是一些实践中使用过的代码片段:
public class UserUtils {
public static String getUserInfo() {
SharedPreferences pref = getAppContext().getSharedPreferences(
"user_login", 0);
return pref.getString("user_info", "");
}
public static boolean saveUserInfo(String info) {
SharedPreferences pref = getAppContext().getSharedPreferences(
"user_login", 0);
return pref.edit().putString("user_info", info).commit();
}
}
在使用的时候,如果服务端返回一个User的JSON数据,那么我们可以这样:
Gson gson = new Gson();
User user = gson.fromJson(response, User.class);
//对user的变量做一些修改,然后保存
UserUtils.saveUserInfo(gson.toJson(user));
//下次使用的时候就可以不用访问网络资源了
User user = gson.fromJson(UserUtils.getUserInfo(), User.class);
非常简洁的代码,就能实现一个对象数据的本地持久化缓存,而且使用起来异常灵活,非常高的可拓展性。
最后呢,给大家推荐一些非常好用的Android工具:
AsyncHttpClient、Gson
个人感觉,这两个玩意儿凑到一起,在Android平台上真的是太强大了,前者自己实现了一套异步网络资源请求,不需要自己开新线程,大家可以到它的官方网站上面看看,介绍的很详细,后者我也不多说了,总之,谁用谁知道,哈哈。