SharedPreferences는 간단한 값을 저장할 때 주로 사용한다.
초기 설정 값이나 자동 로그인 여부 등 간단한 값을 저장할 때 DB를 사용하면 복잡하기 때문에 SharedPreferences를 사용하면 적합하다.
SharedPreferences는 어플리케이션에 파일 형태로 데이터를 저장한다. 데이터는 (key, value) 형태로 data/data/패키지명/shared_prefs 폴더 안에 xml 파일로 저장된다.
해당 파일은 어플리케이션이 삭제되기 전까지 보존된다.
SharedPreferences는 앱의 어디서든 전역적으로 사용하기 때문에 싱글톤 패턴을 사용해서 어디서든 접근 가능하게 만드는 것이 좋다.
아래 코드는 https://link2me.tistory.com/1819 에서 Java로 구현했던 코드를 약간 수정해서 자바 코드를 Kotlin 으로 자동 변환한 다음에 다시 companion object 로 옮기면서 테스트하고 적어둔다.
예제1)
import android.content.Context import android.content.SharedPreferences
class PrefsHelper { companion object{ // 물음표(?)는 해당 타입의 null 가능 버전을 나타낸다. private var prefs: SharedPreferences? = null private var editor: SharedPreferences.Editor? = null private var prefmodule: PrefsHelper? = null val PREF_NAME = "pref"
val BaudRate = "BaudRate" val DataBit = "DataBit" val StopBit = "StopBit" val Parity = "Parity" val Settings = "0"
fun getInstance(context: Context): PrefsHelper? { if (prefmodule == null) { prefmodule = PrefsHelper() } if (prefs == null) { prefs = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE) editor = prefs!!.edit() } return prefmodule } }
fun getString(key: String, defValue: String): String { // ?. 안전호출 연산자(safe call operator) → NullPointerException 방지 // !! non-null 단언 연산자 return prefs?.getString(key, defValue)!! }
fun putString(key: String, value: String) { // !! non-null 단언 연산자 prefs!!.edit().apply{ putString(key, value) }.apply() }
fun getBoolean(key: String, defValue: Boolean): Boolean { return prefs?.getBoolean(key, defValue)!! }
fun putBoolean(key: String, value: Boolean) { prefs!!.edit().apply{ putBoolean(key, value) }.apply() }
fun getInt(key: String, defValue: Int): Int { return prefs!!.getInt(key, defValue) }
fun putInt(key: String, value: Int) { prefs!!.edit().apply{ putInt(key, value) }.apply() } }
|
MainActivity.kt 에서 쓰기와 읽기 테스트 한 예제
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)
writePreferences("115200", "8", "1", 0)
val BaudRate: String = PrefsHelper.getInstance(this)!!.getString(PrefsHelper.BaudRate, "") val DataBit: String = PrefsHelper.getInstance(this)!!.getString(PrefsHelper.DataBit, "") val StopBit: String = PrefsHelper.getInstance(this)!!.getString(PrefsHelper.StopBit, "") val Parity: String = PrefsHelper.getInstance(this)!!.getString(PrefsHelper.Parity, "")
Log.e("Baurate",BaudRate) Log.e("DataBit",DataBit) Log.e("StopBit",StopBit) Log.e("Parity",Parity) }
private fun writePreferences(baudRate: String, dataBit: String, stopBit: String, parity: Int) { // !!. non-null 단언 연산자 PrefsHelper.getInstance(this)!!.putString(PrefsHelper.BaudRate, baudRate) PrefsHelper.getInstance(this)!!.putString(PrefsHelper.DataBit, dataBit) PrefsHelper.getInstance(this)!!.putString(PrefsHelper.StopBit, stopBit) PrefsHelper.getInstance(this)!!.putString(PrefsHelper.Parity, parity.toString()) PrefsHelper.getInstance(this)!!.putString(PrefsHelper.Settings, "0") } }
|
예제2)
import android.content.Context import android.content.SharedPreferences
class PrefsHelper(context: Context) {
companion object { const val PREFERENCE_NAME = "pref" private lateinit var prefs: SharedPreferences private lateinit var prefsEditor: SharedPreferences.Editor private var instance: PrefsHelper? = null
fun init(context: Context): PrefsHelper? { if (instance == null) instance = PrefsHelper(context) return instance }
fun read(key: String?, defValue: String?): String { return prefs.getString(key, defValue)!! }
fun write(key: String?, value: String?) { prefsEditor.putString(key, value) prefsEditor.commit() }
fun read(key: String?, defValue: Int): Int { return prefs.getInt(key, defValue) }
fun write(key: String?, value: Int?) { prefsEditor.putInt(key, value!!).commit() }
fun read(key: String?, defValue: Boolean): Boolean { return prefs.getBoolean(key, defValue) }
fun write(key: String?, value: Boolean) { prefsEditor.putBoolean(key, value) prefsEditor.commit() } }
init { prefs = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE) prefsEditor = prefs.edit() }
}
|
사용법 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_intro) mContext = this@Intro PrefsHelper.init(applicationContext) // 한번만 실행하면 된다. }
PrefsHelper.write("userid", userID) PrefsHelper.write("userNM", Value.decrypt(result.userinfo!!.userNM)) |