Android/Theory

Android SharedPreference

sh1mj1 2022. 9. 5. 21:22

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() 은 메인 스레드에서 호출하는 것을 피해야 한다.