Android/기타 지식
(SharedPreferences) 2. 사용하기
jaesungLeee
2021. 7. 13. 17:28
이번 포스트에서는 SharedPreferences의 메소드들을 다룬다.
1. SharedPreferences 객체 획득
SharedPreferences의 객체를 획득하기 위한 두가지 메소드가 있다.
- getPreferences(mode : Int)
- Android Developers 공식 가이드에는 다음과 같이 설명되어있다.
- 활동에 하나의 공유 환경설정 파일만 사용해야 하는 경우 Activity에서 이 메서드를 사용합니다. 이 메서드는 활동에 속한 기본 공유 환경설정 파일을 검색하기 때문에 이름을 제공할 필요가 없습니다.
- getPreferences()는 별도의 파일명을 지정하지 않는다. 따라서 이 메소드를 사용하는 Activity의 이름을 갖는 파일 내에 데이터가 저장된다. 예를 들어, MainActivity에서 getPreferences()를 사용해 SharedPreferences 객체를 획득하면 MainActivity.xml에 데이터가 저장된다.
- 따라서, getPreferences()를 사용하면 다른 Activity에서는 데이터를 조회할 수 없다.
-
class PreferencesUtils (context : Context) { val preferences : SharedPreferences = context.getPreferences(Context.Mode_Private) }
- Android Developers 공식 가이드에는 다음과 같이 설명되어있다.
- getSharedPreferences(fileName : String, mode : Int)
- Android Developers 공식 가이드에는 다음과 같이 설명되어있다.
- 첫 번째 매개변수로 지정하는 이름으로 식별되는 여러 공유 환경설정 파일이 필요한 경우 이 메서드를 사용합니다. 앱의 모든 Context에서 이 메서드를 호출할 수 있습니다.
- 지정한 파일 명의 이름으로 xml 파일을 만든다. 따라서, 다른 Activity나 Component에서 이 파일 명으로 데이터를 조회하여 사용할 수 있다. 여러 데이터를 각각의 파일로 나눠 구분하여 사용할 때 주로 사용된다.
-
class PreferencesUtils(context : Context) { val preferences : SharedPreferences = context.getSharedPreferences("MyPreferences", Context.Mode_Private) }
- Android Developers 공식 가이드에는 다음과 같이 설명되어있다.
- Mode
- 각 메소드의 파라미터로 mode가 들어간다. 아래에 mode에 대한 자세한 설명이 있다.
- API 17 이상 부터는 읽기, 쓰기가 deprecated 되었다.
-
Mode 설명 MODE_PRIVATE 어플리케이션 내에서 사용 가능, 외부 어플리케이션에서는 접근 불가 (Default) MODE_WORLD_READABLE 외부 어플리케이션에서 읽기 가능 MODE_WORLD_WRITEABLE 외부 어플리케이션에서 쓰기 가능
2. SharedPreferences 데이터 저장
데이터를 저장하기 위해서는 ShraedPreferences Class 내부의 Editor Interface를 사용한다.
- putString(PREFERENCES_KEY, String)
- putBoolean(PREFERENCES_KEY, Boolean)
- putInt(PREFERENCES_KEY, Int)
- putLong(PREFERENCES_KEY, Long)
- putFloat(PREFERENCES_KEY, Float)
- putStringSet(PREFERENCES_KEY, Set<String>)
위의 함수들로 Key-Value 쌍을 넣었으면 apply() 혹은 commit()을 해줘야 완전히 저장이 된다.
apply()를 하면 메모리 내 SharedPreferences 객체를 즉시 변경하지만 디스크에 비동기적으로 업데이트 한다.
반면, commit()을 하면 동기적으로 업데이트 하지만 UI 렌더링이 중지되는 것을 막기위해 MainThread에서 호출하는 것을 피해야 한다.
private val preferences : SharedPreferences = context.getSharedPreferences("MyPreferences", Context.MODE_PRIVATE)
fun setString() {
val editor = preferences.edit()
editor.putString(KEY, VALUE).apply()
}
3. SharedPreferences 데이터 읽기
get 메소드를 사용하여 SharedPreferences 객체에 저장된 데이터를 가져올 수 있다.
- getString(KEY, defValue : String)
- getBoolean(KEY, true)
- getInt(KEY, defValue : Int)
- getLong(KEY, defValue : Long)
- getFloat(KEY, defValue : Float)
- getStringSet(KEY, defValue : Set<String>)
여기서 defValue는 KEY에 상응하는 VALUE가 없을 시 default로 반환할 VALUE를 의미한다.
private val preferences : SharedPreferences = context.getSharedPreferences("MyPreferences", Context.MODE_PRIVATE)
fun getString() : String {
return preferences.getString(KEY, "").toString()
}
4. SharedPreferences 데이터 영구 저장 방지
이전 포스트에서 설명한 것 처럼 Android 버젼이 올라감에 따라 어플리케이션을 삭제하면 저장된 데이터도 함께 삭제되는 현상이 사라졌다. 따라서, 어플리케이션 삭제시 데이터가 함께 사라지게 하려면 AndroidManifest.xml에 아래의 옵션을 추가해야 한다.
<application
...
android:allowBackup = "false" // default : true
...
android:fullBackupContent = "false" > // add this option
</application>
References
https://developer.android.com/training/data-storage/shared-preferences?hl=ko
https://ddolcat.tistory.com/26