偷懶技巧之--使用sqlite實(shí)現(xiàn)自動緩存json數(shù)據(jù)

上一篇文章講了下如何成為一個“偷懶又高效”的Android開發(fā)人員虐沥,這一篇就講講怎么樣偷懶平项,讓開發(fā)工作變得優(yōu)雅疟呐,簡單玖翅。

做android應(yīng)用開發(fā)的時候最多的場景莫過于從服務(wù)器端獲取數(shù)據(jù)翼馆,然后將數(shù)據(jù)展示在界面上,這些工作看起來復(fù)雜而繁瑣金度,實(shí)則有規(guī)律可循应媚,github上已經(jīng)有大神整理出一些快速開發(fā)的框架(如afinal,Xutils)猜极,但其實(shí)都大同小異中姜,數(shù)據(jù)庫模塊,View注解模塊,圖片處理模塊丢胚,Http請求模塊翩瓜,加上一些常用的工具類和封裝了一些通用的控件等,其實(shí)之前的文章中都或多或少的涉及到一些携龟,如ButterKnife+插件的模式兔跌,大幅度提高了效率,使用glide處理圖片等峡蟋。

聊聊緩存

根據(jù)存儲地方的不同可將緩存分為文件緩存坟桅、數(shù)據(jù)庫緩存、網(wǎng)絡(luò)緩存(存儲到服務(wù)器)蕊蝗、共享參數(shù)(SharedPreferences)仅乓、對象緩存(java bean)等,每種緩存的數(shù)據(jù)的生命周期蓬戚,安全系數(shù)都是不同夸楣,因具體情況而異,說著說著感覺緩存和文件存儲的概念很像子漩,要我說本質(zhì)上就是一個概念豫喧,只是給人的感覺略有不同。

還有一種緩存稱之為請求緩存痛单,可以減少請求服務(wù)器的次數(shù)嘿棘,說白了就設(shè)置了一個定時器劲腿,當(dāng)小于我們設(shè)定的時間就不請求后臺直接從本地緩存取旭绒,超過了時間就從服務(wù)器重新取數(shù)據(jù),目前實(shí)戰(zhàn)中還沒使用到焦人,不過還是要考慮進(jìn)去的挥吵,目前的做法是先檢查本地緩存再請求網(wǎng)絡(luò),沒有減少網(wǎng)絡(luò)請求花椭,但至少可以讓沒有網(wǎng)絡(luò)的時候界面顯示的不那么糟糕忽匈。

開始設(shè)計(jì)緩存數(shù)據(jù)庫

只需要一張表即可,將json數(shù)據(jù)作為一個字段保存而非將json數(shù)據(jù)解析完分別存入多張表(那樣的創(chuàng)建的表太多了)矿辽,如下

_id url data time
主鍵 請求地址 json數(shù)據(jù) 時間

創(chuàng)建緩存數(shù)據(jù)庫和表

public class DBHelper extends SQLiteOpenHelper {

    public static final String DBNAME = "djk";
    public static final int version = 1;
    public static final String CACHE = "cache";
    public static final String ID = "_id";
    public static final String URL = "url";
    public static final String DATA = "data";
    public static final String TIME = "time";

    public DBHelper(Context context) {
        super(context, DBNAME, null, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE IF NOT EXISTS "
                + CACHE + " ("
                + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                + URL + " TEXT, "
                + TIME + " TEXT, "
                + DATA + " TEXT)";
        db.execSQL(sql);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}~~~
數(shù)據(jù)庫操作管理,

public class DBManager {
private SQLiteDatabase db;
private DBHelper dbHelper;

public DBManager() {
    dbHelper = new DBHelper(App.getContext());
}

/**
 * 插入緩存,沒有就插入钞钙,有就替換
 *
 * @param url  地址
 * @param data json數(shù)據(jù)
 */
public synchronized void insertData(String url, String data) {
    db = dbHelper.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(DBHelper.URL, url);
    values.put(DBHelper.DATA, data);
    values.put(DBHelper.TIME, System.currentTimeMillis());
    db.replace(DBHelper.CACHE, null, values);
    db.close();
}

/**
 * 根據(jù)url獲取緩存數(shù)據(jù)
 *
 * @param url 地址
 * @return 數(shù)據(jù)
 */
public synchronized String getData(String url) {
    String result = "";
    db = dbHelper.getReadableDatabase();
    Cursor cursor = db.rawQuery("SELECT * FROM " + DBHelper.CACHE + " WHERE URL = ?", new String[]{url});
    while (cursor.moveToNext()) {
        result = cursor.getString(cursor.getColumnIndex(DBHelper.DATA));
    }
    cursor.close();
    db.close();
    return result;
}

}~~~

使用

雖然請求的框架有所不同诅岩,但是大致方式是一致的,在封裝請求框架時注意要返回String類型宾娜,比如使用volley批狐,要用StringRequest,將返回的數(shù)據(jù)存入數(shù)據(jù)庫前塔,在請求之前可檢查是否存在緩存即可嚣艇,可通過參數(shù)控制是否要緩存數(shù)據(jù)承冰,另外time字段可作為緩存失效的依據(jù),數(shù)據(jù)解析的方式是一樣的食零,無非是一個來自后臺數(shù)據(jù)庫困乒,一個取自本地數(shù)據(jù)庫。

第三方請求框架使用的時候最好先封裝下再用慌洪,結(jié)合具體的業(yè)務(wù)場景可寫出更簡潔的代碼顶燕,也方便日后維護(hù)擴(kuò)展。

另外冈爹,我計(jì)劃利用業(yè)余的時間寫一個小項(xiàng)目GanK(使用了干貨集中營的數(shù)據(jù)),上面講到的一些技巧會在項(xiàng)目中體現(xiàn)出來涌攻,歡迎大家關(guān)注。

關(guān)于之前寫的一篇文章自己造輪子--android常用多條件篩選菜單實(shí)現(xiàn)思路(類似美團(tuán)频伤,愛奇藝電影票下拉菜單)中提到一些改進(jìn)的想法恳谎,我已經(jīng)完成了部分,我后面會盡量抽時間將它完善憋肖,快過年了因痛,前天我正式辭掉了目前的工作(也是我的第一份正式工作),明年又是一個新的開始岸更,加油M腋唷!同時在這里給大家拜個早年怎炊,新年快樂L菲蟆!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末评肆,一起剝皮案震驚了整個濱河市债查,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瓜挽,老刑警劉巖盹廷,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異久橙,居然都是意外死亡俄占,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門淆衷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缸榄,“玉大人,你說我怎么就攤上這事吭敢∨鲂祝” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長欲低。 經(jīng)常有香客問我辕宏,道長,這世上最難降的妖魔是什么砾莱? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任瑞筐,我火速辦了婚禮,結(jié)果婚禮上腊瑟,老公的妹妹穿的比我還像新娘聚假。我一直安慰自己,他們只是感情好闰非,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布膘格。 她就那樣靜靜地躺著,像睡著了一般财松。 火紅的嫁衣襯著肌膚如雪瘪贱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天辆毡,我揣著相機(jī)與錄音菜秦,去河邊找鬼。 笑死舶掖,一個胖子當(dāng)著我的面吹牛球昨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播眨攘,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼主慰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了期犬?” 一聲冷哼從身側(cè)響起河哑,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤避诽,失蹤者是張志新(化名)和其女友劉穎龟虎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沙庐,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鲤妥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拱雏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棉安。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖铸抑,靈堂內(nèi)的尸體忽然破棺而出贡耽,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布蒲赂,位于F島的核電站阱冶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏滥嘴。R本人自食惡果不足惜木蹬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望若皱。 院中可真熱鬧镊叁,春花似錦、人聲如沸走触。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽互广。三九已至蛔添,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兜辞,已是汗流浹背迎瞧。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逸吵,地道東北人凶硅。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像扫皱,于是被迫代替她去往敵國和親足绅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容