Android で端末にデータ保存をする時は以下の選択肢になるかと思う。
- ファイルとして保存 (SDカードなど)
- SQLiteデータベースに保存
- SharedPreference に保存
それら一つ一つに長所・短所があり、使いどころがあるのだけれど、それぞれのメリットを合わせたような素晴らしいやり方があるので紹介。
Gson + SharedPreference
このコンボを利用することだ。具体的にはオブジェクトをJson化して保存し、読み込む時はそのJsonをパースするという方法。これで一気にオブジェクトの保存と復元が可能だ。しかも配列として復元することも可能なのでDBアクセスっぽいこともできる。
さてどうするか。コードを紹介しよう。
保存、取得コードの作成
ObjectStorage.java
public class ObjectStorage { public static void save(Object src, String key) { String json = new Gson().toJson(src); new CachePref().put(key, json); } public static <T> T get(String key, Class<T> klazz) { String jsonStr = new CachePref().get(key, ""); if (jsonStr.equals("")) { return null; } return new Gson(),.fromJson(jsonStr, klazz); } }
CachePref.java
public class CachePref { private final static String RPEF_NAME = "cache"; private SharedPreferences pref; private SharedPreferences.Editor editor; public static final String KEY_USER = "user"; public static final String KEY_USER_LIST = "user_list"; public CachePref() { Context context = ApplicationController.getInstance().getApplicationContext(); pref = context.getSharedPreferences(RPEF_NAME, Context.MODE_PRIVATE); editor = pref.edit(); } public String get(String key, String defaultValue) { return pref.getString(key, defaultValue); } public void put(String key, String value) { editor.putString(key, value).commit(); } }
これだけだ!
ObjectStorage の利用
以下のようなモデルを用意しよう。
public class User { private String id; private String email; private String password; public String getId() { return id; } public String getEmail() { return email; } public String getPassword() { return password; } }
そんでそれを読み書きしよう
// 単一 User user; // userにデータ入れる // 保存 ObjectStorage.save(user, CachePref.KEY_USER); // 取得 user = ObjectStorage.get(CachePref.KEY_USER, User.class); // 配列 User[] users; // users にデータ入れる // 保存 ObjectStorage.save(users, CachePref.KEY_USER_LIST); // 取得 users = ObjectStorage.get(CachePref.KEY_USER_LIST, User[].class);
おわりに
これでSharedPreferenceの良さとDBの良さそれぞれを併せ持つ素晴らしいストレージが完成した。 もちろん、SQLiteに比べてselectを用いたデータアクセスができないという点はあるが、データ数が100個以内なら余裕でforで1件ずつアクセスしても良いと思う。
アップデートも削除も全部上書きすればいいだけなので、データ数の少ないオブジェクトの保存であれば、これで十分だと思う。
コネクシィではこのオブジェクト保存方法でたくさんのキャッシュを生成しております!