Androidアプリ内データ保存「SharedPreferences」

## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) SharedPreferences

Androidアプリ内に手っ取り早くデータ保存するには「SharedPreferences」というのを使うようです。保存可能なデータ型は限られるようですが、よく使うと思われる、
　１）`String`
　２）`Set<String>`
　３）`ArrayList<String>`
の３パターンについて「保存／取得」処理をまとめました。


## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) １）String型の保存／取得

```java:Setting.java
// 設定値 String を保存（Context は Activity や Application や Service）
public static void saveString(Context ctx, String key, String val) {
	SharedPreferences prefs = ctx.getSharedPreferences(APP_NAME, Context.MODE_PRIVATE);
	SharedPreferences.Editor editor = prefs.edit();
	editor.putString(key, val);
	editor.apply();
}

// 設定値 String を取得（Context は Activity や Application や Service）
public static String loadString(Context ctx, String key) {
	SharedPreferences prefs = ctx.getSharedPreferences(APP_NAME, Context.MODE_PRIVATE);
	return prefs.getString(key, ""); // 第２引数はkeyが存在しない時に返す初期値
}
```


## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) ２）Set\<String\>型の保存／取得

```java:Setting.java
// 設定値 Set<String> を保存（Context は Activity や Application や Service）
public static void saveStringSet(Context ctx, String key, Set<String> vals) {
	SharedPreferences prefs = ctx.getSharedPreferences(APP_NAME, Context.MODE_PRIVATE);
	SharedPreferences.Editor editor = prefs.edit();
	editor.putStringSet(key, vals);
	editor.apply();
}

// 設定値 Set<String> を取得（Context は Activity や Application や Service）
public static Set<String> loadStringSet(Context ctx, String key) {
	SharedPreferences prefs = ctx.getSharedPreferences(APP_NAME, Context.MODE_PRIVATE);
	return prefs.getStringSet(key, new HashSet<String>()); // 第２引数はkeyが存在しない時に返す初期値
}
```

Setは順序が不定なので、順序を保持したい場合は、下記のArrayListを使います。


## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) ３）ArrayList\<String\>型の保存／取得

```java:Setting.java
// 設定値 ArrayList<String> を保存（Context は Activity や Application や Service）
public static void saveList(Context ctx, String key, ArrayList<String> list) {
	JSONArray jsonAry = new JSONArray();
	for(int i=0; i<list.size(); i++) {
		jsonAry.put(list.get(i));
	}
	SharedPreferences prefs = ctx.getSharedPreferences(APP_NAME, Context.MODE_PRIVATE);
	SharedPreferences.Editor editor = prefs.edit();
	editor.putString(key, jsonAry.toString());
	editor.apply();
}

// 設定値 ArrayList<String> を取得（Context は Activity や Application や Service）
public static ArrayList<String> loadList(Context ctx, String key) {
	ArrayList<String> list = new ArrayList<String>();
	SharedPreferences prefs = ctx.getSharedPreferences(APP_NAME, Context.MODE_PRIVATE);
	String strJson = prefs.getString(key, ""); // 第２引数はkeyが存在しない時に返す初期値
	if(!strJson.equals("")) {
		try {
			JSONArray jsonAry = new JSONArray(strJson);
			for(int i=0; i<jsonAry.length(); i++) {
				list.add(jsonAry.getString(i));
			}
		} catch(Exception ex) {
			ex.printStackTrace();
		}
	}
	return list;
}
```

ArrayListは直接保存できないので、JSONArrayを介して、Stringとして保存／取得します。


## ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/8157fb95-559a-856d-af0d-e4f75f0c40f6.png) おまけ

<font color="ff0000">■</font>`Set<String>`をループで回す

```java
Iterator<String> it = set.iterator();
while(it.hasNext()) {
	String str = it.next();
}
```

<font color="ff0000">■</font>`Set<String>` ⇒ `String[]` への変換

```java
String[] ary = (String[])set.toArray(new String[]{});
```

<font color="ff0000">■</font>`ArrayList<String>` ⇒ `String[]` への変換

```java
String[] ary = (String[])list.toArray(new String[]{});
```

(･o･ゞ いじょー。