自己动手写DB数据库框架(增)

1. 概述


  在Android开发中我们经常要进行各种网络访问,比如查看各类新闻、查看各种图片。但有一种情形就是我们在规定的时间内每次重复发送的网络请求其实返回的数据可能都是一样的。比如一个电影类APP,每一次向服务器申请某个电影的相关信息,如封面、简介、演员表等等,它们的信息都是一样的,这样就有点浪费资源,最主要的是这些重复的请求产生了没有必要的流量。流量、流量、流量!!!重要的事情说三遍!而流量是要付费的,而且超贵,公司那么小,一个月要支付宽带运营商巨额的流量费用。所以领导们都想方设法地要节省带宽, 其实这在整个软件开发中随时可见,解决的一般套路都是把重复请求的数据缓存在本地,并设置超时时间,在规定时间内,客户端不再向远程请求数据,而是直接从本地缓存中取数据。这样一来提高了响应速度,二来节省了网络带宽(也就是节省了钱)。

所有分享大纲:2017Android进阶之路与你同行

视频讲解地址:http://pan.baidu.com/s/1pLM1X3t

20161203153128998.png

2. 缓存的分类


2.1 服务端侧缓存

  常见的服务端有Ngix和Apache。服务端缓存又分为代理服务器缓存和反向代理服务器缓存。常见的CDN就是服务器缓存。这个好理解,当浏览器重复访问一张图片地址时,CDN会判断这个请求有没有缓存,如果有的话就直接返回这个缓存的请求回复,而不再需要让请求到达真正的服务地址,这么做的目的是减轻服务端的运算压力。

2.2 客户端侧缓存

  客户端主要指浏览器(如IE、Chrome等),当然包括我们的前面所讲的OkHttpClient.客户端第一次请求网络时,服务器返回回复信息。如果数据正常的话,客户端缓存在本地的缓存目录。当客户端再次访问同一个地址时,客户端会检测本地有没有缓存,如果有缓存的话,数据是有没有过期,如果没有过期的话则直接运用缓存内容,声明一下这是一般套路。
 

3. 第三方网络缓存分析


  服务器的缓存处理对于我们来说是可以不用关心的,只需要关心客户端的请求缓存处理,我们来看一下第三方的网络框架的处理方式,我就直接拿Okhttp为例吧,原理就是我们上面所讲的显而易见,你也可以自行看Okhttp的源代码,这里我直接上张流程图:

网络框架的缓存逻辑.png

3. 特有的缓存场景

  上面所说的针对大部分app是没有任何问题的,我们在开发中可以直接使用第三方的网络开源框架自带的缓存,但是内涵段子这个项目比较奇葩,因为内容更新比较频繁我们要确保每次获取的数据都是最新的,所以我们必须每次请求都要访问最新数据,这对于我们来说第三方的网络缓存框架然并卵,我们需要按需定制。
  
  既然如此我们需要使用自己的缓存逻辑,那么大致的逻辑是我们每次请求之前都会去本地缓存拿,如果本地有先拿过来显示确保用户体验,然后去服务器上获取数据如果获取的数据不一样,那么重新刷新界面并将获取到的数据加入缓存,如果获取的数据和缓存里面的一致那么什么都不做。

  讲到这里我们必须了解一下数据库了,因为我打算把数据缓存到数据库中,那我们上网找找第三方的开源数据库吧。ORMLite,GreenDao,DB4O,Perst,Litepal 等等,这个时候问题又来了,我们第三方的数据库一般都是缓存在data/data/包名/database下面,这样一来如果缓存的数据比较多,多少有点对不住人家。所以我们打算把数据库放到内存卡中,这样的话你多一点就多一点,而且如果手抖卸载了内涵段子然后发现还是忘不了里面的某个女主播你懂的,这个时候重新装上app的时候我们的缓存数据库也都还在。你也可以看看自己的内存卡中有很多的数据库,那些都是某些app特意写到外部存储卡的。

3. 数据库动员大会

  各位同事各位精英,为了我们公司的明天,大家作为核心的程序员我希望你们必须对你们用的东西了如指掌,不然出了bug就非常的麻烦了。直接使用别人的是初级,看完了会模仿着写一个是中级,自己按照需求来写一个框架就是高级。大家一定要努力好好学习好好提升自己的能力,今天每人先领一台Iphone7,只要国家公务员的工资涨了,我一定给你们涨工资。说得好听,我要是老板也这样反正有钱就是爷。

GAN_8A_ZDDUX19R0CBJ}Z{X.png

有了这个接下来我就上一段代码:

/**
 * Created by Darren on 2017/2/28.
 * Email: 240336124@qq.com
 * Description: 工厂设计模式  IDaoSupport的工厂
 */

public class DaoSupportFactory {

    public static DaoSupportFactory mFactory;
    // 数据库SQLiteDatabase
    private SQLiteDatabase mDatabase;

    public DaoSupportFactory() {
        File databaseDir = new File(Environment.getExternalStorageDirectory()
                + File.separator + "nhdz" + File.separator + "database");
        if (!databaseDir.exists()) {
            databaseDir.mkdirs();
        }
        // 数据库放在外部存储卡下面  nhdz/database/nhdz.db
        File dataBaseFile = new File(databaseDir, "nhdz.db");
        mDatabase = SQLiteDatabase.openOrCreateDatabase(dataBaseFile, null);
    }

    /**
     * 获取DaoSupportFactory实例
     *
     * @return
     */
    public static DaoSupportFactory getFactory() {
        if (mFactory == null) {
            synchronized (DaoSupportFactory.class) {
                if (mFactory == null) {
                    mFactory = new DaoSupportFactory();
                }
            }
        }
        return mFactory;
    }

    /**
     * 获取IDaoSupport
     */
    public  IDaoSupport getDaoSupport(Class clazz) {
        IDaoSupport daoSupport = new DaoSupport();
        // 初始化数据
        daoSupport.init(mDatabase, clazz);
        return daoSupport;
    }
}

再看看使用方式:

// 直接从工厂里面获取
IDaoSupport daoSupport = DaoSupportFactory.getFactory().getDaoSupport(Person.class);
// 插入数据对象
daoSupport.insert(new Person("Darren", 23));

所有分享大纲:2017Android进阶之路与你同行

视频讲解地址:http://pan.baidu.com/s/1pLM1X3t

IT文库 » 自己动手写DB数据库框架(增)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址