안드로이드 앱을 개발하면서 데이터를 저장하는 방법은 여러 가지가 있는데, 그 중 하나인 SharedPreferences
를 사용해보려고 한다.
-> 간단한 값을 저장할 때 주로 사용한다. 초기 설정 값이나 자동 로그인 여부 등 간단한 값을 저장할 때 DB를 사용하면 복잡하기 때문에 SharedPreferences를 사용하면 적합하다.
SharedPreferences는 어플리케이션에 파일 형태로 데이터를 저장한다. 데이터는 (key, value) 형대로 data/data/패키지명/shared_prefs 폴더 안에 xml 파일로 저장된다. 해당 파일은 어플리케이션이 삭제되기 전까지 보존된다.
- getSharedPreferences() : 이름으로 식별되는 공유 환경설정 파일이 여러 개 필요한 경우 이 매서드를 사용한다.
- getPreferences() : 활동에 공유 환경설정 파일을 하나만 사용해야 하는 경우 Activity에서 이 메서드를 사용한다. 이 메서드는 활동에 속한 기본 공유 환경설정 파일을 검색하기 때문에 이름을 제공할 필요가 없다.
sharedPreferences 파일에 정보를 담으려면 edit()
을 사용해야 한다.
그리고 변경된 사항을 저장하기 위해 apply()
또는 commit()
을 사용해야 한다.(무슨 차이인지는 잘 모르겠)
val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
with (sharedPref.edit()) {
putInt(getString(R.string.saved_high_score_key), newHighScore)
apply()
}
정보를 보낼 EditActivity()
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityEditBinding.inflate(layoutInflater) setContentView(binding.root) ... binding.saveBtn.setOnClickListener { saveInfo() finish() } } private fun saveInfo() { with(getSharedPreferences("userInfo", Context.MODE_PRIVATE).edit()){ putString(NAME, binding.nameEditText.text.toString()) putString(BIRTH_DATE, binding.birthValueTextView.text.toString()) putString(BLOOD_TYPE, getBloodType()) putString(PHONE_NUMBER, binding.phoneNumberEditText.text.toString()) putString(PRECAUTION,getPrecaution()) apply() } Snackbar.make( binding.root, "저장이 완료되었습니다.", Snackbar.LENGTH_SHORT ).show() }
정보를 받을 MainActivity
override fun onResume() { super.onResume() getUserInfo() } private fun getUserInfo() { with(getSharedPreferences(USER_INFO, Context.MODE_PRIVATE)){ binding.nameValueTextView.text = getString(NAME, "미정") binding.birthValueTextView.text = getString(BIRTH_DATE, "미정") binding.bloodValueTextView.text = getString(BLOOD_TYPE, "미정") binding.phoneNumberValueTextView.text= getString(PHONE_NUMBER, "미정") val precautionState = getString(PRECAUTION, "") binding.precautionTextView.isVisible = precautionState.isNullOrEmpty().not() binding.precautionValueTextView.isVisible = precautionState.isNullOrEmpty().not() if(!precautionState.isNullOrEmpty()){ binding.precautionValueTextView.text = precautionState } } }