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 だけじゃなく
複数の型を持つオブジェクト作って実験してみよう。
ディスカッション
コメント一覧
まだ、コメントがありません