Android SharedPreference
SharedPrefernce
Context.gethsharedPreference(String, int)
로 리턴된 preference을 접근하고 수정하는 인터페이스.
특정 집합에 대해 모든 클라이언트가 공유하는 이 클래스의 단일 인스턴스가 있다.
즉, 이것은 싱글톤 패턴과 연관이 있다!!
SharedPreference 는 데이터를 파일로 저장하는데 이 파일은 앱 폴더 내에 있다. 앱이 삭제되기 전까지 저장한 데이터가 보존된다.
data/data/(패키지 이름)/shared_prefs/SharedPreference
기본 설정값이 유지되고, 수정을 하고자 하면 저장소에 commit될 때 Editor 개체를 통과해야 한다. 다양한 get 메서드로 리턴될 수 있다. 이 때 응용 프로그램에서 변경할 수 없는 것으로 처리해야 한다.
💡 note: 이 클래스는 강력한 일관성을 제공한다. 앱 속도를 저하시킬 수 있는 코스트가 높은 작업이기 때문에 속성을 자주 변경하려면 다른 매커니즘을 사용해야 한다.
Save key-value data
상대적으로 적은 key-value 을 저장하고 싶다면 SharedPreferences
을 사용해야 한다. SharedPreference
개체는 key-value 을 포함하는 파일을 가리킨다. 그리고 읽고 쓰는 간단한 메서드를 제공한다. 각 SharedPreferences
파일은 framework에 의해 관리되고 이는 private 할 수도 공유될 수도 있다.
How to use the SharedPreferences
API
getSharedPreferences()
- 이름으로 정의된 다양한 shared preference 파일이 필요할 때 사용. 이름은 첫번째 매개변수로 지정한다. 앱 내의 어떠한 Context 에서도 부를 수 있다.
getPreferences()
- 이 액티비티에 대한 오직 하나의 공유된 preference을 사용할 필요가 있을 때 액티비티로부터 이것을 사용한다.. 액티비티에 속한 기본 공유 preference 파일을 검색하기 때문에 이름이 필요 없다.
아직 getPreferences() 을 사용해 본 적이 없다.. 사실 크게 용도가 와닿지 않아서 계속 공부하면서 getPreferences() 메서드를 사용하는 오픈 소스 코드가 있으면 좋겠네요.. ㅎ
EX)
R.string.preference_file_key
로 식별되는 preference 파일에 엑세스. 비공개 모드를 사용하여 파일을 열기 때문에 앱에서만 파일에 엑세스가 가능하다고 하면
val sharedPref = activity?.getSharedPreferences(
getString(R.string.preference_file_key), Context.MODE_PRIVATE)
EX)
액티비티에 공유 preference 파일이 하나만 필요하면 getPreference()
메서드를 사용할 수 있다.
val sharedPref = activity?.getPreferences(Contxt.MODE_PRIVATE)
putInt()
및 putString()
(등등, 많은 타입이 있다.)과 같은 메서드를 사용하여 쓰려고 하는 키와 값을 전달한다.
그 후 apply()
또는 commit()
을 호출하여 변경사항을 저장한다.
Ex)
val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
with (sharedPref.edit()) {
putInt(getString(R.string.saved_high_score_key), newHighScore)
apply()
}
// 혹은 아래처럼 edit 의 인자를 true 로 넣어주면 따로 commit()하지 않아도 된다.
sharedPref.edit(true) {
putInt(getString(R.string.saved_high_score_key), newHighScore)
}
그렇다면 왜 apply() 와 commit() 으로 두가지 메서드가 따로 있는 것일까? 두 메서드는 큰 차이가 있다.
apply() VS commit()
apply() 는 메모리 내의 SharedPreferences 개체를 즉시 변경하지만 디스크에는 비동시적으로 업데이트한다.
commit() 은 디스크에 동기적으로 업데이트한다. 그래서 commit() 은 메인 스레드에서 호출하는 것을 피해야 한다.