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 だけじゃなく
複数の型を持つオブジェクト作って実験してみよう。


 

ディスカッション
コメント一覧
まだ、コメントがありません