HOME > android > tips

안드로이드 - SharedPreferences에 ArrayList를 저장하는 방법

JSFollow05 Mar 2018

보통 SharedPreferences는 1개의 키에 대해서 1개의 String을 저장합니다. 하지만 1개의 Key에 대해서 ArrayList 형식의 데이터를 저장하고 싶을 때가 있습니다. DB를 쓸 정도는 아닌데, SharedPreferences를 사용하기에는 번거롭네. SharedPreferences에 ArrayList를 저장할 수 있으면 좋을텐데... 하고 말이죠. Json을 이용하면 ArrayList 형식의 데이터를 SharedPreferences에 저장할 수 있습니다.

결론적으로 말하면, 이 방법도 1개의 키에 대해서 1개의 String을 저장하는 것입니다. ArrayList의 데이터를 Json형식으로 변환하여 1개의 String으로 만든 후 이를 SharedPreferences에 저장할 수 있습니다. 반대로 읽을 때는 Json 형식의 String을 읽어와 다시 ArrayList로 변환하면 됩니다. 물론 저장하거나 읽을 때 Json 형식으로 변환하거나 파싱을 해야 하지만, 메소드로 만들어두면 쉽게 사용할 수 있습니다.

먼저 SharedPreferences 데이터 저장 및 읽는 방법을 설명하고, ArrayList를 저장하는 방법을 소개하겠습니다.

이 글에서 사용된 코드는 GitHub에 있습니다.

SharedPreferences에 String을 저장하는 방법

먼저 SharedPreferences에 String을 저장하는 코드를 소개하겠습니다. 아래 코드처럼 getSharedPreferences로 원하는 이름의 Preference를 가져올 수 있습니다. 그리고 putString으로 데이터를 추가하며, apply로 현재 변경된 데이터를 파일에 저장합니다.

private static final String SETTINGS_PLAYER = "settings_player";
private void putSettingItem(String key, String value) {
    Log.d(TAG, "Put " + key +" (value : " + value + " ) to " + SETTINGS_PLAYER);
    SharedPreferences preferences = getSharedPreferences(SETTINGS_PLAYER, MODE_PRIVATE);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putString(key, value);
    editor.apply();
}

private String getSettingItem(String key) {
    Log.d(TAG, "Get " + key + " from " + SETTINGS_PLAYER);
    return getSharedPreferences(SETTINGS_PLAYER, 0).getString(key, null);
}

위의 메소드들은 아래처럼 사용할 수 있습니다. 버튼을 누를 때 데이터를 저장하거나 읽는 코드입니다.

private static final String SETTINGS_PLAYER_SPEED = "settings_item_speed";
private static final String SETTINGS_PLAYER_VOLUME = "settings_item_volume";
private static final String SETTINGS_PLAYER_LANGUAGE = "settings_item_language";

btnPutSettings.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        putSettingItem(SETTINGS_PLAYER_SPEED, "fast");
        putSettingItem(SETTINGS_PLAYER_VOLUME, "20");
        putSettingItem(SETTINGS_PLAYER_LANGUAGE, "KOR");
    }
});

btnGetSettings.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String speed = getSettingItem(SETTINGS_PLAYER_SPEED);
        String volume = getSettingItem(SETTINGS_PLAYER_VOLUME);
        String lang = getSettingItem(SETTINGS_PLAYER_LANGUAGE);
        Log.d(TAG, "Speed: " + speed + ", Volume: "+volume + ", Language: " + lang);
    }
});

SharedPreferences에 ArrayList 형식의 데이터를 저장하는 방법

이번에는 ArrayList 형식의 데이터를 저장하는 방법을 알려드릴 것인데요. 위에서 말씀드린 것처럼 이것도 역시 1개의 String을 저장하는 것입니다. 저장된 String은 Json형식이기 때문에 ArrayList로 변환이 가능합니다.

아래 코드 setStringArrayPref는 ArrayList를 Json으로 변환하여 SharedPreferences에 String을 저장하는 코드입니다. getStringArrayPref는 SharedPreferences에서 Json형식의 String을 가져와서 다시 ArrayList로 변환하는 코드입니다.

private void setStringArrayPref(Context context, String key, ArrayList<String> values) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = prefs.edit();
    JSONArray a = new JSONArray();
    for (int i = 0; i < values.size(); i++) {
        a.put(values.get(i));
    }
    if (!values.isEmpty()) {
        editor.putString(key, a.toString());
    } else {
        editor.putString(key, null);
    }
    editor.apply();
}

private ArrayList<String> getStringArrayPref(Context context, String key) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    String json = prefs.getString(key, null);
    ArrayList<String> urls = new ArrayList<String>();
    if (json != null) {
        try {
            JSONArray a = new JSONArray(json);
            for (int i = 0; i < a.length(); i++) {
                String url = a.optString(i);
                urls.add(url);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    return urls;
}

위의 메소드들은 아래처럼 사용할 수 있습니다. 버튼을 누르면 ArrayList를 저장하고 복원하는 코드입니다.

// ArrayList -> Json으로 변환
private static final String SETTINGS_PLAYER_JSON = "settings_item_json";
btnPutJson.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("first");
        list.add("second");
        list.add("third");
        list.add("fourth");
        setStringArrayPref(SETTINGS_PLAYER_JSON, list);
        Log.d(TAG, "Put json");
    }
});

// Json -> ArrayList로 변환
btnGetJson.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ArrayList<String> list = getStringArrayPref(SETTINGS_PLAYER_JSON);
        if (list != null) {
            for (String value : list) {
                Log.d(TAG, "Get json : " + value);
            }
        }
    }
});

참고