1. 概述
這節(jié)課我們就來搭建我們自己的一個數(shù)據(jù)庫框架撇他,首先先來說下我們?yōu)槭裁葱枰ゾ彺鏀?shù)據(jù)到數(shù)據(jù)庫馍悟,這個是我們這節(jié)課的一個重點评姨,如果咱們大家有做新聞類帮坚、資訊類的app盏道,那么凡是涉及到需要展示列表的界面稍浆,不管是用 ListView、RecyclerView顯示的列表猜嘱,都是必須要緩存該列表的數(shù)據(jù)的衅枫,主要的原因有兩點。
2. 原因
原因一:
如果每次進入app時朗伶,比如說我們的應用是一個新聞或者資訊的列表弦撩,那么你每次一打開app,它都會去服務器中去請求列表數(shù)據(jù)论皆,如果說網(wǎng)絡不是特別好益楼,那么可能需要2-3秒或者更長的時間后臺才能返回數(shù)據(jù),然后你再去展示到你的列表中点晴,這樣用戶體驗可能并不是特別好感凤,因為用戶如果一進來app時發(fā)現(xiàn)沒有數(shù)據(jù),什么都沒有粒督,就是一個空白頁面陪竿,這樣可能或多或少都會影響用戶體驗,所以這個時候緩存列表數(shù)據(jù)到數(shù)據(jù)庫就顯得尤為重要坠陈;
原因二:
如果你對需要展示的列表的數(shù)據(jù)去緩存萨惑,那么你完全可以在有網(wǎng)絡的時候讓它去請求網(wǎng)絡,展示最新的數(shù)據(jù)仇矾,如果沒有網(wǎng)絡或者網(wǎng)絡不是特別好的話庸蔼,就去展示緩存中的內(nèi)容,這樣就不至于在app剛一打開就是白屏贮匕,什么都沒有姐仅,這樣用戶體驗就會稍微好一些;
注意:
做緩存的話必須兩端都需要去做緩存刻盐,app端和服務器端需要去做緩存掏膏,那么我們接下來先看下常規(guī)的后臺服務器是以及我們的app,它們是如何做緩存的敦锌。
3. app客戶端和服務器如何做緩存馒疹?
3.1:服務器端緩存方法:
后臺有一個緩存,還有一個數(shù)據(jù)庫乙墙,每次app請求服務器接口時颖变,后臺先去查詢緩存中是否有數(shù)據(jù)生均,如果緩存中有就直接把緩存中的數(shù)據(jù)返回給app就ok,如果緩存中沒有腥刹,就去查詢數(shù)據(jù)庫马胧,然后把數(shù)據(jù)給app返回回來,并且把數(shù)據(jù)再給緩存中保存一份衔峰,這樣下次app再去請求服務器接口時就直接可以把緩存中的數(shù)據(jù)給app返回就可以了佩脊。
套路就是:服務器有一個緩存,一個數(shù)據(jù)庫垫卤,每次app請求接口時服務器端首先先去查緩存威彰,如果緩存有數(shù)據(jù)就直接返回就ok,如果沒有就去查詢數(shù)據(jù)庫葫男,然后把數(shù)據(jù)給app返回回去抱冷,并且把數(shù)據(jù)再給緩存中存儲就ok;
3.2:app緩存方法:
比如OKHttp緩存梢褐,它是自帶緩存旺遮,特點就是如果我們訪問同一個接口,那么它在規(guī)定時間內(nèi)盈咳,是不會去后臺請求數(shù)據(jù)的耿眉,而是直接讀取緩存的,如果超過規(guī)定時間鱼响,就會去后臺請求數(shù)據(jù)鸣剪。
套路就是:比如說規(guī)定時間是60秒,它會首先從本地緩存中查詢數(shù)據(jù)丈积,如果沒有它會去請求服務器數(shù)據(jù)筐骇,在獲取到數(shù)據(jù)之后就會把數(shù)據(jù)給緩存中存儲一份,那么下一次就會直接從緩存中讀取數(shù)據(jù)江滨,而不會去請求服務器數(shù)據(jù)了铛纬,這個就是 OKHttp的緩存。
注意:
一般第三方的聯(lián)網(wǎng)請求緩存基本都是這樣子的緩存的唬滑,比如OKHttp告唆、Retrofit等等這些第三方網(wǎng)絡請求框架的緩存基本都類似。
那么接下來我們就來看下晶密,針對于新聞類app我們應該如何去做緩存擒悬,才能達到一個相對來說比較好的用戶體驗。網(wǎng)上的第三方數(shù)據(jù)庫框架特別多稻艰,比如:GreenDao懂牧、litepal、orm等等尊勿,而且用法基本都類似僧凤,都是一些套路用狱,而且我們必須要把這些套路玩好,玩6,拼弃。但是它們的數(shù)據(jù)庫都是放在 data/data/包名/database目錄下邊的,如果app卸載了那么數(shù)據(jù)庫就沒了摇展。而且我們沒有必要去造輪子吻氧,但是有的時候我們我們還真就得對一些特定場景進行量身定制,這個是我們今天要做的咏连。
3. 新聞類app如何緩存盯孙?
如下圖所示:
上圖意思就是,以下緩存指的是文件或者數(shù)據(jù)庫都可以:
1>:第一次剛進入app時緩存中肯定沒有數(shù)據(jù)祟滴,這個時候就會去請求服務器拉取最新數(shù)據(jù)振惰,并且也要求服務器最好給自己做一個緩存,把剛請求的數(shù)據(jù)也給自己服務器保存一份垄懂,然后返回數(shù)據(jù)給app端骑晶,這個時候app就去在列表中顯示數(shù)據(jù),并且app客戶端的也需要在文件或者數(shù)據(jù)庫中存儲一份數(shù)據(jù)草慧;
2>:第二次app再次打開的時候需要再次顯示列表數(shù)據(jù)的時候桶蛔,這個時候首先先在自己本地的文件或者數(shù)據(jù)庫查詢,如果有數(shù)據(jù)漫谷,就直接給列表顯示仔雷,與此同時直接去請求服務器拉取最新數(shù)據(jù),如果服務器返回數(shù)據(jù)了舔示,這個時候比較返回的數(shù)據(jù)和自己本地緩存的數(shù)據(jù)碟婆,如果數(shù)據(jù)一樣,就不去刷新界面也不去存入到數(shù)據(jù)庫惕稻,如果不一樣竖共,就去刷新本地列表,然后把新的數(shù)據(jù)再存儲到自己本地的文件或者數(shù)據(jù)庫中就行缩宜。
注意這里的存儲數(shù)據(jù)的方式是以key-value鍵值對存儲肘迎,key是url地址,value值是 返回的json數(shù)據(jù)锻煌,而不是對象妓布,因為對象太大;
就是這樣宋梧,每次進入app列表先從app的緩存中讀取數(shù)據(jù)匣沼,如果有就直接顯示在列表,與此同時直接去請求服務器捂龄,如果服務器有數(shù)據(jù)释涛,就返回給app加叁,然后比較客戶端的數(shù)據(jù)庫中的數(shù)據(jù)與返回的數(shù)據(jù)是否一樣,如果不一樣唇撬,就去重新刷新列表數(shù)據(jù)它匕,然后給緩存中再去存儲一份數(shù)據(jù)即可;
這種緩存就比較適合類似頭條新聞窖认、QQ空間等等的這種數(shù)據(jù)更新比較快的豫柬。
4. 我們?yōu)槭裁匆謩哟罱〝?shù)據(jù)庫框架?
我們之所以自己要手動去搭建數(shù)據(jù)庫框架扑浸,是因為一般第三方的數(shù)據(jù)庫烧给,都是存儲在 data/data/包名/database中的,如果app卸載了喝噪,那么數(shù)據(jù)庫就沒有了础嫡,而我們自己寫的數(shù)據(jù)庫框架,它是存儲在外部存儲卡中酝惧,可以直接導出來查看榴鼎,非常的方便。
那么下節(jié)課我們就來手動搭建我們自己的數(shù)據(jù)庫系奉。