Table of Contents
Androidで簡単なデータ保存を行う場合は SharedPreferences がよく利用されます。
SharedPreferences を使えば、数値や文字列、フラグなどの保存が簡単にできます。しかし、デフォルトでは配列(リスト)を、その要素の順番を維持して保存するという機能はありません。
文字列の配列(セット)を保存するためのメソッド putStringSet や読み込むためのメソッド getStringSet がありますが、これは順番の情報が保存されません。
この問題を解決するためには、リストの情報を JSONArray に変換し、それを文字列として保存します。
今回は、実際に複数の文字列を含んだ ArrayList を SharedPreferences に保存する例を紹介します。
サンプルプログラム
文字列を複数含んだ ArrayList を保存して読み込むプログラムです。
コードは Kotlin ですが Java でも同様の仕組みで動作します。
package パッケージ名 import android.content.Context import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.util.Log import org.json.JSONArray class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 保存するリスト val arrayList: ArrayList<String> = ArrayList() arrayList.add("first") arrayList.add("second") arrayList.add("third") arrayList.add("fourth") arrayList.add("fifth") // 保存 saveArrayList("test", arrayList) // 読み込み loadArrayList("test") } // リストの保存 fun saveArrayList(key: String, arrayList: ArrayList<String>) { val shardPreferences = this.getPreferences(Context.MODE_PRIVATE) val shardPrefEditor = shardPreferences.edit() val jsonArray = JSONArray(arrayList) shardPrefEditor.putString(key, jsonArray.toString()) shardPrefEditor.apply() } // リストの読み込み fun loadArrayList(key: String) { val shardPreferences = this.getPreferences(Context.MODE_PRIVATE) val jsonArray = JSONArray(shardPreferences.getString(key, "[]")); for (i in 0 until jsonArray.length()) { Log.i("loadArrayList", "[$i] -> " + jsonArray.get(i)) } } }
サンプルの実行結果です。
以下のように ArrayList に保存した文字列が順番通り読み込まれていることがわかります。
ArrayListの保存方法
保存したいリストを JSONArray にパースして、さらに全体を toString で文字列に変換し、それを文字列として保存します。
val jsonArray = JSONArray(arrayList) shardPrefEditor.putString(key, jsonArray.toString())
保存したArrayListを読み込む方法
文字列として保存した JSONArray のデータを文字列として読み込み、それをforループで部分ごとに読み出しています。
val jsonArray = JSONArray(shardPreferences.getString(key, "[]")); for (i in 0 until jsonArray.length()) { // i が保存した順番 // jsonArray.get(i) でその番号の文字列を読み出す Log.i("loadArrayList", "[$i] -> " + jsonArray.get(i)) }
メソッド loadArrayList を以下のように書き換えれば、読み込んだデータを再び保存した時と同じ ArrayList の形式に戻して得ることができます。
fun loadArrayList(key: String) : ArrayList<String> { val shardPreferences = this.getPreferences(Context.MODE_PRIVATE) val jsonArray = JSONArray(shardPreferences.getString(key, "[]")); val arrayList : ArrayList<String> = ArrayList() for (i in 0 until jsonArray.length()) { arrayList.add(jsonArray.get(i) as String) } return arrayList }
おしまい
以上が ArrayList を SharedPreferences に保存する方法です。
同様の方法で ArrayList 以外のリストやコレクションを SharedPreferences に保存することができます。