Android/Kotlin
[Android, Kotlin] SharedPreferences
겨울시인
2022. 4. 20. 10:23
1. SharedPreferences 가 뭐야?
간단하게, 앱에서 데이터를 저장하는 방법중에 하나로 앱 내부 DB 라 말할 수 있다.
SharedPreferences는 간단한 값을 저장할 때 주로 사용하는데 이러한 값들이 매번 저장될 때 마다 DB를 사용하게 되면 복잡하기 때문에 단순한 데이터를 Save/Load 하는데 사용한다고 생각하면 된다.
앱 내부에 xml 파일로 저장이 되며 데이터와 함께 설정된 keyValue 를 통해 Save/Load 할 수 있다.
데이터의 보존은 앱이 삭제되기전까지는 유지된다.
2. 기능 구현
- EditText 를 만들어 text 입력 후, 화면을 닫았다가 다시 열어도 입력 text가 그대로 유지될 수 있도록 해보자.
(SharedPreferences 를 쓰지 않는 일반적인 경우, text가 저장되지 않아 사라진다)
3. Android Studio에서 기본 프로젝트(with empty activity) 생성하자!
생성시 'Empty Activity'로 기본 생성
4. ViewBinding 사용을 위한 build.gradle 설정
android {
// 뷰 바인딩 옵션 활성화
viewBinding {
enabled = true
}
}
5. activity_main.xml
Text를 입력 받기 위한 EditText 하나를 만들어 놓자.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:id="@+id/et_hello"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
android:textColor="#000000"
android:textSize="24sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
6. MainActivity.kt
- saveData() 메소드를 만들어 액티비티가 종료되는 onDestroy() 에서 호출 : Text 저장
- loadData() 메소드를 만들어 액티비티가 시작되는 onCreate() 에서 호출 : Text 불러오기
SharedPreferences
- Save : SharedPreferences 인스턴스 -> edit()로 수정모드 set -> put 메소드 with Key -> apply()
- Load : SharedPreferences 인스턴스 -> get 메소드 with Key
class MainActivity : AppCompatActivity() {
private var mBinding:ActivityMainBinding? = null
private val binding get() = mBinding!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// 저장된 데이터를 로드
loadData()
}
private fun saveData() {
val pref = getSharedPreferences("pref",0)
val edit = pref.edit() // 수정 모드
// 1번째 인자는 키, 2번째 인자는 실제 담아둘 값
edit.putString("name", binding.etHello.text.toString())
edit.apply() // 저장완료
}
private fun loadData() {
val pref = getSharedPreferences("pref",0)
// 1번째 인자는 키, 2번째 인자는 데이터가 존재하지 않을경우의 값
binding.etHello.setText(pref.getString("name",""))
}
// 해당 액티비티가 종료되는 시점이 다가올때 호출
override fun onDestroy() {
super.onDestroy()
//저장된 데이터를 저장
saveData()
}
}
7. 실행결과
원하던 대로 EditText에 입력한 text 값이 화면을 내렸다 다시 올려도 SharedPreferences 를 참조하여 정상적을 불러온다.
참고 : 일반적으로 SharedPreferences 는 앱에서 전역으로 사용하기 때문에 싱글톤 패턴을 사용해서 어디서든 접근 가능하게
만드는 것이 좋다는데 이번 예제는 너무 간단해서 싱글톤 패턴을 활용하는 방법에 대해서는 추후 더 알아봐야겠다.