サボるテクニック--sqliteを使用してjsonデータの自動キャッシュを実現

3972 ワード

前の記事では、「サボって効率的」なAndroid開発者になる方法について説明しました.この記事では、サボって開発を優雅にし、簡単にする方法について説明します.
Androidアプリケーションの開発を行う際に最も多くのシーンは、サーバ側からデータを取得し、インタフェースにデータを表示することです.これらの作業は複雑で煩雑に見えますが、実際には規則的で、githubには急速に開発されたフレームワーク(afinal、Xutilsなど)が整理されていますが、実際には大きく異なります.データベースモジュール、View注釈モジュール、画像処理モジュール、Httpリクエストモジュール、いくつかのよく使われるツールクラスといくつかの共通のコントロールをパッケージ化するなど、実は以前の文章ではButterKnife+プラグインのモードなど、ButterKnife+プラグインのモードが多かれ少なかれ関連しており、効率を大幅に向上させ、glideを使って画像を処理するなどしています.
キャッシュについて
格納場所によってキャッシュをファイルキャッシュ、データベースキャッシュ、ネットワークキャッシュ(サーバに格納)、共有パラメータ(SharedPreferences)、オブジェクトキャッシュ(java bean)などに分けることができますが、キャッシュされるデータのライフサイクルごとにセキュリティ係数が異なり、状況によってキャッシュとファイルストレージの概念が似ていると感じています.ただ、人に与える感じは少し違います.
もう一つのキャッシュはリクエストキャッシュと呼ばれ、リクエストサーバの回数を減らすことができ、はっきり言ってタイマーを設置し、私たちが設定した時間より小さい場合はバックグラウンドから直接ローカルからのアクセスを要求せず、時間を超えたらサーバからデータを再取得し、現在実戦ではまだ使用されていないが、考慮しなければならない.しかし、少なくともネットワークがないときにインタフェースがそれほど悪く表示されないようにすることができます.
キャッシュ・データベースの設計を開始
1枚のテーブルのみで、jsonデータを複数のテーブル(そのように作成されたテーブルが多すぎる)にそれぞれ格納するのではなく、1つのフィールドとしてjsonデータを保存します.
_id
url
data
time
プライマリキー
リクエストアドレス
jsonデータ
時間
キャッシュ・データベースとテーブルの作成
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) {

    }
}~~~
       ,

public class DBManager { private SQLiteDatabase db; private DBHelper dbHelper;
public DBManager() {
    dbHelper = new DBHelper(App.getContext());
}

/**
 *     ,     ,    
 *
 * @param url    
 * @param data json  
 */
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();
}

/**
 *   url      
 *
 * @param url   
 * @return   
 */
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を使用して、返されたデータをデータベースに格納し、要求前にキャッシュが存在するかどうかをチェックすればよい.パラメータによってデータをキャッシュするかどうかを制御することができる.またtimeフィールドはキャッシュの失効の根拠とすることができ、データ解析の方法は同じである.バックグラウンド・データベースから、ローカル・データベースから取得されたデータベースにほかならない.
サードパーティがフレームワークを要求するときは、まずカプセル化してから使用したほうがいいです.具体的なビジネスシーンと結びつけて、より簡潔なコードを書くことができ、将来のメンテナンスと拡張を容易にすることができます.
また、余暇を利用して小さなプロジェクトGanK(干物収容所を使ったデータ)を書く予定ですが、上記のテクニックがプロジェクトに反映されるので、注目してください.
前に書いた文章について自分で車輪を作りました--androidはよく多条件のスクリーニングメニューの実現構想(美団、愛奇芸映画の切符のドロップダウンメニューに似ています)の中でいくつかの改善の考えに言及して、私はすでに一部を完成して、私の後でできるだけ時間を割いてそれを改善して、もうすぐ正月になって、一昨日私は正式に現在の仕事を辞めました(私の最初の正式な仕事でもあります)、来年はまた1つの新しい始まりで、頑張ってください!!同时にここでみんなに新年を拝んで、新年おめでとうございます!!