高畑 匡秀

2014.02.12

SharedPreferencesに色々なオブジェクト保存する

お久しぶりです。高畑です。
最初の挨拶を「こんにちは」か「お久しぶりです」のどちらにしようか迷いました。
今回はAndoridアプリ開発には欠かせない機能の1つである、SharedPreferencesに色々なオブジェクトを保存する方法について書こうと思います。

SharedPreferencesとは

SharedPreferencesはアプリ内でデータを保存する方法のひとつで
xml形式で保存されます。
主な利用目的は、アプリの設定値の保存やタスクを終了しても残しておきたい情報を保存するために使います。
手軽に実装できるので、利用する場面は多いと思います。
iPhoneアプリで言うところの「NSUserDefaults」に近いものがありますが
SharedPreferencesは保存できる型はかなり限られており
現在以下の型のみ保存できます。

例えば以下のようなコードでSharedPreferencesに値を入れて保存して

保存したファイルの中身を見ると以下のようなxmlになっています。

emulatorで実行している場合にSharedPreferencesの中身を取り出したい時は
DDMSでdata/data/<アプリのパッケージ名>/shared_prefs/<ファイル名>
にファイルが保存されているのでそれを取り出します。

実機の場合はadbコマンドを使って中を見ることができます

色々なオブジェクトを保存する

SharedPreferencesは非常に便利ですが、上記の通り保存できるオブジェクトの型に制限があります。
そこで役に立つのがGsonです。
GsonはオブジェクトをJSON文字列に変換・復元できるライブラリです。
SharedPreferencesに対応した型以外のオブジェクトを保存したい場合は
保存したいオブジェクトをJSON文字列にして、putStringで保存する事ができます。
復元するときには、getStringで取得したJSON文字列をGsonを用いてオブジェクトに復元する事ができます。

例えば以下のようなUserクラスがあったとします

UserのプロパティにDateやArrayListなど、SharedPreferencesに対応していない型も入れてみます。

このクラスに値をセットしてGsonでJSON文字列に変換してSharedPreferencesに保存します。

SharedPreferenceの中身は以下のようになっています。

「”」がエスケープされて見にくいですが、エスケープを戻すと以下のような感じです

JSON形式で保存されているのがわかります。
復元するときは、以下のように行います。

こんな感じに非常に簡単に復元できます。
ただ、BitmapをGsonで文字列に変換するのは利用に耐えないほど遅く、ANRが発生する可能性が高いので使えないです。

どうしても画像を保存したい場合はBase64での文字列変換をお勧めします。

Base64への変換は高速なので、うまい具合にGsonと使い分けると良いと思います。
しかし、この方法でもあまり大きい画像を変換すると、少しアプリの動きが詰まります。
小さめのプロフィール画像などをキャッシュしておく程度の使い方に止めておきましょう。
Gsonと組み合わせれば、TwitterやFacebookのAPIで取得したユーザー情報ぐらいなら保存しておくことが可能です。

最後に

SharedPreferencesにあまり大きなデータを保存すると
アプリケーションのサイズがどんどん膨らむのでいかがなものかと思いますが
こういう使い方もできるということで何かの参考になれば嬉しいです。