22.SharePreference + Gson做本地缓存

情景

很多开发的时候,需要做本地缓存。常见的做本地数据缓存的方式有:
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)了,还有比这更爽的方式吗?

在使用的时候,如果服务端返回一个User的JSON数据,那么我们可以这样:

学以致用

1.存储简单实体Bean

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); 

非常简洁的代码,就能实现一个对象数据的本地持久化缓存,而且使用起来异常灵活,非常高的可拓展性。

2.存储\获取实体Bean集合

从存储数据到本地中,如下:

    /**
     * 缓存多程查询信息
     */
    private void putUserDataToCache() {
        SharedPreferences sp = getSharedPreferences("LAST_QUERY_PARAM_USER", Context.MODE_PRIVATE);
        if (sp == null) return;
        SharedPreferences.Editor edit = sp.edit();
        edit.putString("KEY_CACHE_USER", mGson.toJson(mUserDataList));
        edit.apply();
    }

从本地缓存中获取数据,如下:

// 先从缓存中获取数据
SharedPreferences sp = getSharedPreferences("LAST_QUERY_PARAM_USER", 0);
mUserInfoDataList = mGson.fromJson(sp.getString("KEY_CACHE_USER", null), new TypeToken>() { }.getType());

注意

从缓存中取集合时,mGson.fromJson(sp.getString("KEY_CACHE_USER", null), new TypeToken>() { }.getType());这里传入的第二个参数是new TypeToken>() { }.getType()

你可能感兴趣的:(22.SharePreference + Gson做本地缓存)