fkm blog

software開発に関することを書いていきます

Key-Value Storageっぽいのを作ってみた

AndroidにはSQLiteがありますが, RDBなのでテーブル作ったり列名決めたりと, いろいろ面倒.

俺が欲しいはkeyがidのみのストレージだ! というケースがあるので, なんちゃってで実装してみた. 結局SQLiteに入れちゃうので, なんちゃって実装.

リポジトリここ まだmasterにマージしてないのでdevelopブランチを見てくださいな(2014-4-22時点)

使い方

mavenリポジトリへの追加はgithubのREADMEみてください

KVSImplを継承したクラスを作る

T型とbyte[]の相互変換さえ書いてもらえればOK.

よく使うであろうJSONObjectは、ライブラリ側にtoolsとしていれちゃってもいいかもしれない。。。

public class JsonKVS extends KVSImpl<JSONObject> {
    private static final String CHARSET = "utf-8";

    protected JsonKVS(Context context, String dbName) {
        super(context, dbName);
    }

    @Override
    protected JSONObject createFromBlob(byte[] bytes) {
        try {
            String body = new String(bytes, CHARSET);
            return new JSONObject(body);
        } catch (UnsupportedEncodingException e) {
            return new JSONObject();
        } catch (JSONException e2) {
            return new JSONObject();
        }
    }

    @Override
    protected byte[] toBytes(JSONObject value) {
        try {
            return value.toString().getBytes(CHARSET);
        } catch (UnsupportedEncodingException e) {
            return new byte[0];
        }
    }
}
このクラスを使う

dbNameがバケツみたいなものです. バケツ毎に.dbファイルを作ります.

// json1, json2 は JSONObject
KVS<JSONObject> kvs = new JsonKVS(getContext(), "appUser");
kvs.put("key1", json1);
kvs.put("key2", json2);
// puしたらコミット
kvs.commit();

// key指定で取得。対応するのが無かったらnull
JSONObject data = kvs.get("key1");
JSONObject data2 = kvs.get("unknownKey");
assert data2 == null;

// 裏はSQLiteなので、closeを忘れずに
kvs.close();

SharedPreferencesでいいんじゃない?

SharedPreferencesも, APIだけ見るとKey-Value storageとして使えそうな気がするけど, 出力が1ファイルなので, レコードが増えてきたときに苦しくなりそうな感. SQLiteも苦しくなるけど, SharedPreferencesよりは多分マシなはず。。。