프로젝트를 진행하다보면, 필연적으로 데이타를 저장해야 할 경우가 생긴다.
이럴 때, 보통은 DB 에 저장하거나 파일에 직접 저장해두고 필요할 때마다 꺼내 쓰지만,
안드로이드에서는 이러한 과정을 간단하게 대신 처리해주는 SharedPreferences
라는 클래스를 제공한다.
SharedPreferences
는 간단한 (key, value) pair 데이타들을 어플리케이션 내에 파일 형태로 저장, 조회, 삭제하는 기능을 제공한다.
간단한 사용 예제를 살펴보자.
SharedPreferences 사용 예제
조회
key 에 대응하는 value 를 조회한다.
- 데이타 타입에 따라 getAll(), getString(), getStringSet(), getInt(), getLong(), getFloat(), getBoolean() 을 사용할 수 있다.
- getInt(key, 0); 에서 두 번째 인자 0 은 해당 key 에 대한 데이타가 저장되어 있지 않을 때, 반환되는 default value 이다.
저장
key 에 대응하는 value 를 저장한다.
- 데이타 타입에 따라 putString(), putStringSet(), putInt(), putLong(), putFloat(), putBoolean() 을 사용할 수 있다.
- 데이타 저장 및 삭제시에는 반드시 apply() 또는 commit() 을 해 주어야 반영된다. (apply() 를 권장한다.)
삭제
key 에 대응하는 (key, value) pair 를 삭제한다.
- 데이타 저장 및 삭제시에는 반드시 apply() 또는 commit() 을 해 주어야 반영된다. (apply() 를 권장한다.)
모든 데이타 삭제하기
preference_file_name 에 저장된 모든 데이타를 삭제한다.
- 데이타 저장 및 삭제시에는 반드시 apply() 또는 commit() 을 해 주어야 반영된다. (apply() 를 권장한다.)
apply() vs commit()
공통점
- 둘 다 데이타를 저장한다.
- 둘 다 2개 이상의 editor 가 동시에 수정하면 마지막에 호출된 것이 적용된다.
apply()
- 비동기 방식
- returns void : 이 때문에 commit() 보다 빠르다.
- UI Thread 에서 사용할 수 있다.
- API level 9 부터 추가되었다.
commit()
- 동기 방식
- returns boolean : 정상적으로 저장완료 되면 true, 그렇지 않으면 false
- UI Thread 에서 사용할 수 없다.
- API level 1 부터 추가되었다.
결론
- 저장이 완료되었는지 반드시 확인 받아야 하는 상황이 아니라면 apply() 를 사용하자.
SharedPreferences 사용시 주의점
실수하기 쉬운 코드 1
아래와 같이 하면 정상적으로 저장되지 않는다.
edit()
메소드는 항상 새로운 인스턴스를 반환한다.
따라서, 3번째 줄 pref.edit().putInt(key, value);
에서 반환한 인스턴스와 pref.edit().apply();
에서 반환한 인스턴스는 다른 인스턴트다.
위의 코드를 다시 풀어 쓰면, 아래와 같은 황당한 코드가 된다.
이 코드를 보면 왜 틀렸는지 이해가 될 것이라 믿는다.
실수하기 쉬운 코드 2
Multi Process 환경에서 SharedPreferences 를 사용할 때 MODE_PRIVATE 으로 열면 정상적으로 작동하지 않을 수 있다. 아래와 같이 MODE_MULTI_PROCESS 를 사용하자.
- MODE_PRIVATE 이나 MODE_MULTI_PROCESS 에 대한 이야기는 다음 기회에 ~ ^^;