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


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