728x90

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))


블로그 이미지

Link2Me

,