보통 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);
}
}
}
});
참고
- 이 글에서 사용된 코드는 GitHub에 있습니다.
- How can write code to make SharedPreferences - StackOverflow
Related Posts
- Android 14 - 사진/동영상 파일, 일부 접근 권한 소개
- Android - adb push, pull로 파일 복사, 다운로드
- Android 14 - 암시적 인텐트 변경사항 및 문제 해결
- Jetpack Compose - Row와 Column
- Android 13, AOSP 오픈소스 다운로드 및 빌드
- Android 13 - 세분화된 미디어 파일 권한
- Android 13에서 Notification 권한 요청, 알림 띄우기
- Android 13에서 'Access blocked: ComponentInfo' 에러 해결
- 에러 해결: android gradle plugin requires java 11 to run. you are currently using java 1.8.
- 안드로이드 - 코루틴과 Retrofit으로 비동기 통신 예제
- 안드로이드 - 코루틴으로 URL 이미지 불러오기
- Android - 진동, Vibrator, VibrationEffect 예제
- Some problems were found with the configuration of task 에러 수정
- Query method parameters should either be a type that can be converted into a database column or a List
- 우분투에서 Android 12 오픈소스 다운로드 및 빌드
- Android - ViewModel을 생성하는 방법
- Android - Transformations.map(), switchMap() 차이점
- Android - Transformations.distinctUntilChanged() 소개
- Android - TabLayout 구현 방법 (+ ViewPager2)
- Android - 휴대폰 전화번호 가져오는 방법
- Android 12 - Splash Screens 알아보기
- Android 12 - Incremental Install (Play as you Download) 소개
- Android - adb 명령어로 bugreport 로그 파일 추출
- Android - adb 명령어로 App 데이터 삭제
- Android - adb 명령어로 앱 비활성화, 활성화
- Android - adb 명령어로 특정 패키지의 PID 찾기
- Android - adb 명령어로 퍼미션 Grant 또는 Revoke
- Android - adb 명령어로 apk 설치, 삭제
- Android - adb 명령어로 특정 패키지의 프로세스 종료
- Android - adb 명령어로 screen capture 저장
- Android - adb 명령어로 System 앱 삭제, 설치
- Android - adb 명령어로 settings value 확인, 변경
- Android 12 - IntentFilter의 exported 명시적 선언
- Android - adb 명령어로 공장초기화(Factory reset)
- Android - adb logcat 명령어로 로그 출력