[Kotlin] AndroidでArrayListをSharedPreferencesに保存

By | 2018年1月23日

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をSharedPreferencesに保存して読み込んだ結果

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*