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 に保存することができます。

