本身動手寫DB數據庫框架(增)

###1. 概述程序員


在Android開發中咱們常常要進行各類網絡訪問,好比查看各種新聞、查看各類圖片。但有一種情形就是咱們在規定的時間內每次重複發送的網絡請求其實返回的數據可能都是同樣的。好比一個電影類APP,每一次向服務器申請某個電影的相關信息,如封面、簡介、演員表等等,它們的信息都是同樣的,這樣就有點浪費資源,最主要的是這些重複的請求產生了沒有必要的流量。流量、流量、流量!!!重要的事情說三遍!而流量是要付費的,並且超貴,公司那麼小,一個月要支付寬帶運營商鉅額的流量費用。因此領導們都千方百計地要節省帶寬,其實這在整個軟件開發中隨時可見,解決的通常套路都是把重複請求的數據緩存在本地,並設置超時時間,在規定時間內,客戶端再也不向遠程請求數據,而是直接從本地緩存中取數據。這樣一來提升了響應速度,二來節省了網絡帶寬(也就是節省了錢)。數據庫

全部分享大綱:2017Android進階之路與你同行設計模式

視頻講解地址:http://pan.baidu.com/s/1pLM1X3t     
###2. 緩存的分類瀏覽器


2.1 服務端緩存緩存

常見的服務端有Ngix和Apache。服務端緩存又分爲代理服務器緩存和反向代理服務器緩存。常見的CDN就是服務器緩存。這個好理解,當瀏覽器重複訪問一張圖片地址時,CDN會判斷這個請求有沒有緩存,若是有的話就直接返回這個緩存的請求回覆,而再也不須要讓請求到達真正的服務地址,這麼作的目的是減輕服務端的運算壓力。bash

2.2 客戶端緩存服務器

客戶端主要指瀏覽器(如IE、Chrome等),固然包括咱們的前面所講的OkHttpClient.客戶端第一次請求網絡時,服務器返回回覆信息。若是數據正常的話,客戶端緩存在本地的緩存目錄。當客戶端再次訪問同一個地址時,客戶端會檢測本地有沒有緩存,若是有緩存的話,數據是有沒有過時,若是沒有過時的話則直接運用緩存內容,聲明一下這是通常套路。markdown

###3. 第三方網絡緩存分析網絡


服務器的緩存處理對於咱們來講是能夠不用關心的,只須要關心客戶端的請求緩存處理,咱們來看一下第三方的網絡框架的處理方式,我就直接拿Okhttp爲例吧,原理就是咱們上面所講的顯而易見,你也能夠自行看Okhttp的源代碼,這裏我直接上張流程圖:app

網絡框架的緩存邏輯.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 <T> IDaoSupport<T> getDaoSupport(Class<T> clazz) {
        IDaoSupport<T> daoSupport = new DaoSupport<>();
        // 初始化數據
        daoSupport.init(mDatabase, clazz);
        return daoSupport;
    }
}
複製代碼

再看看使用方式:

// 直接從工廠裏面獲取
IDaoSupport<Person> daoSupport = DaoSupportFactory.getFactory().getDaoSupport(Person.class);
// 插入數據對象
daoSupport.insert(new Person("Darren", 23));
複製代碼

全部分享大綱:2017Android進階之路與你同行

視頻講解地址:http://pan.baidu.com/s/1pLM1X3t

相關文章
相關標籤/搜索