Android SharedPreferencesでList<String>を保存してみる

List<String>を保存するにあたり

・Gsonライブラリ
・Jacksonライブラリ
・JSONArray

を使ってみたので
ざっくりコメントとソースコードを貼っていく。

 

GsonとJacksonの各ライブラリを利用できるようにする

ライブラリが利用できるように
app/build.gradle に以下を追記して同期する。

dependencies {
    // gson
    implementation 'com.google.code.gson:gson:2.8.5'
    // jacson
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.8'
}

 

Gsonを使ってList<String>をjsonにする

 

PreferenceUtilにGsonを使った保存・取得メソッドを用意

保存には、putStringListGson()
取得には、getStringListGson()
を使う。

new Gson() を利用し List を json にする。

public class PreferenceUtil {

    enum PreferenceKey {
        KEY_GSON,
        KEY_JACKSON,
        KEY_JSONARR,
    }

    public static void putStringListGson(Context context, PreferenceKey key, List<String> value) {
        Gson gson = new Gson();
        String jsonValue = gson.toJson(value);

        SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
        editor.putString(key.name(), jsonValue);
        editor.apply();
    }

    public static List<String> getStringListGson(Context context, PreferenceKey key) {
        String jsonValue = PreferenceManager.getDefaultSharedPreferences(context)
                .getString(key.name(), "");

        Gson gson = new Gson();
        // jsonValueが空文字の場合、fromJson()でnullになるのでnewして返す
        return TextUtils.isEmpty(jsonValue)
                ? new ArrayList<>()
                : gson.fromJson(jsonValue, new TypeToken 	 	 	() {}.getType());
    }
}

 

MainActivity.java

Activity側で保存するListを生成しput処理を呼ぶ。
保存後、ボタン押下でテキストを表示する。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        List<String> stringList = Arrays.asList(
                "ああ¥n", "空は¥n", "こんなに¥n", "青いのに¥n");

        PreferenceUtil.putStringListGson(
                getApplicationContext(),
                PreferenceUtil.PreferenceKey.KEY_GSON, stringList);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(view -> {
            List<String> strListGson = PreferenceUtil.getStringListGson(
                    getApplicationContext(), PreferenceUtil.PreferenceKey.KEY_GSON);

            StringBuilder builder = new StringBuilder();
            strListGson.forEach(builder::append);

            TextView textView = findViewById(R.id.text_view);
            textView.setText(builder.toString());
        });
    }
}

 

activity_main.xml

レイアウトは、真ん中に画面、下部にボタンがあるだけ。
ボタンのクリックイベントはActivity側で実装。

<?xml version="1.0" encoding="utf-8"?>


    

    

ボタン押下で真ん中にテキストが出てくるだけの画面が以下

 

Jacksonを使ってList<String>をjsonにする

 

PreferenceUtilにJacksonを使った保存・取得メソッドを用意

保存には、putStringListJackson()
取得には、getStringListJackson()
を使う。

new ObjectMapper() を利用し List を json にする。

※ 以下のソースコードは PreferenceUtil に追加する

public static void putStringListJackson(Context context, PreferenceKey key, List<String> value) throws Exception {
    ObjectMapper objectMapper = new ObjectMapper();
    String jsonValue = objectMapper.writeValueAsString(value);

    SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
    editor.putString(key.name(), jsonValue);
    editor.apply();
}

public static List<String> getStringListJackson(Context context, PreferenceKey key) throws Exception {
    String jsonValue = PreferenceManager.getDefaultSharedPreferences(context)
            .getString(key.name(), "");

    ObjectMapper objectMapper = new ObjectMapper();
    // jsonValueが空文字の場合、readValue()でMismatchedInputExceptionになるのでnewして返す
    return TextUtils.isEmpty(jsonValue)
            ? new ArrayList<>()
            : objectMapper.readValue(jsonValue, new TypeReference 	 	 	() {
    });
}

 

MainActivity.java

jacksonの場合、try/catchが増えるが
やることはGsonと変わりない。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        List<String> strList = Arrays.asList(
                "眠れない¥n", "よーる¥n", "君の¥n", "せいだよー¥n");

        try {
            PreferenceUtil.putStringListJackson(
                    getApplicationContext(),
                    PreferenceUtil.PreferenceKey.KEY_JACKSON, strList);
        } catch (Exception e) {
            e.printStackTrace();
        }

        Button button = findViewById(R.id.button);
        button.setOnClickListener(view -> {

            try {
                List<String> strListJackson = PreferenceUtil.getStringListJackson(
                        getApplicationContext(), PreferenceUtil.PreferenceKey.KEY_JACKSON);

                StringBuilder builder = new StringBuilder();
                strListJackson.forEach(builder::append);

                TextView textView = findViewById(R.id.text_view);
                textView.setText(builder.toString());
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }
}

 

JSONArrayを使ってList<String>をjsonにする

 

PreferenceUtilにJSONArrayを使った保存・取得メソッドを用意

保存には、putStringListJsonArr()
取得には、getStringListJsonArr()
を使う。

new JSONArray() を利用し List を json にする。

※ 以下のソースコードは PreferenceUtil に追加する

public static void putStringListJsonArr(Context context, PreferenceKey key, List<String> value) {
    JSONArray jsonArray = new JSONArray();
    for (int i = 0; i < value.size(); i++) {
        jsonArray.put(value.get(i));
    }
    String jsonValue = jsonArray.toString();

    SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
    editor.putString(key.name(), jsonValue);
    editor.apply();
}

public static List<String> getStringListJsonArr(Context context, PreferenceKey key) throws Exception {
    String jsonValue = PreferenceManager.getDefaultSharedPreferences(context)
            .getString(key.name(), "");

    List<String> list = new ArrayList<>();

    // jsonValueが空文字の場合、new JSONArray()でJSONExceptionになる
    if (!TextUtils.isEmpty(jsonValue)) {
        JSONArray jsonArray = new JSONArray(jsonValue);
        for (int i = 0; i < jsonArray.length(); i++) {
            list.add(jsonArray.getString(i));
        }
    }

    return list;
}

 

MainActivity.java

JSONArray を利用する場合でも基本的なやり方は変わらない。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        List<String> strList = Arrays.asList(
                "いざ進めや¥n", "キッチン¥n", "めざすは¥n", "じゃがいも¥n");

        PreferenceUtil.putStringListJsonArr(
                getApplicationContext(),
                PreferenceUtil.PreferenceKey.KEY_JSONARR, strList);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(view -> {
            try {
                List<String> strListJsonArr = PreferenceUtil.getStringListJsonArr(
                        getApplicationContext(), PreferenceUtil.PreferenceKey.KEY_JSONARR);

                StringBuilder builder = new StringBuilder();
                strListJsonArr.forEach(builder::append);

                TextView textView = findViewById(R.id.text_view);
                textView.setText(builder.toString());
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }
}

 

まとめ

目的は、List を json にして SharedPreference に保存だが
いくつか方法があるのでちょっと試してみたかった。

Gson が一番使いやすいかな。

次は String だけじゃなく
複数の型を持つオブジェクト作って実験してみよう。

開発日記

Posted by konp