데이터베이스로 Room과 Firebase만 사용하던 도중 SharedPreferences가 있다는 것을 알게되어 정리해보려 한다.
먼저 SharedPreferences란 안드로이드 플랫폼에서 데이터를 영구적으로 저장하고 검색하기 위한 기능을 제공하는 클래스이다.
앱을 종료했다가 다시 실행하여도 데이터가 저장되어 있도록 하는 것이다.
간단한 텍스트 데이터를 키-값 쌍으로 저장하고 검색할 수 있습니다.
다른 DB와 다르게 이것은 간단한 데이터를 저장하기 위해 사용한다. 예를들어 개인마다 앱의 초기 설정 값을 저장한다던가, 자동 로그인을 할 때 사용한다.
SharedPreferences는 그냥 하나의 Acrivity에 구현 할 수 있지만, 실제 앱에 구현할때에는 전역적으로 사용되어야 하기 때문에 싱글톤 패턴을 사용하는 실습을 진행하였다.
여기서 싱글톤 패턴이란 클래스의 인스턴스가 단 하나만 생성되고, 어디서든지 그 인스턴스에 접근할 수 있는 디자인 패턴을 말한다. 하나만 만들어 놓으면 재사용 가능한 것이라는 의미이다.
먼저 Application 클래스를 작성하여 앱의 실행 시 자동으로 초기화 되도록 한다.
Application 클래스 -> myApp.kt
package com.example.패키지명 // Manifest에서 에러가 뜰 경우 이 부분 제대로 봐야함 !!
import android.app.Application
class myApp : Application() {
companion object {
lateinit var prefs: PreferenceUtil
}
override fun onCreate() {
prefs = PreferenceUtil(applicationContext)
super.onCreate()
}
}
AndroidManifest.xml
<application
android:name="com.example.패키지명.myApp"
...
</application>
여기서 나는 android:name 속성에 대해 알지 못해서 찾아보았다.
android:name 속성을 사용하여 Application 클래스를 지정하면 앱이 실행될 때 해당 클래스의 인스턴스가 생성되고, 앱의 모든 구성 요소에서 공유할 수 있는 전역적인 상태와 동작을 관리할 수 있다.
쉽게 말해 앱이 실행되면 저기 설정해놓은 myApp클래스가 자동으로 실행된다.
manifest에서 에러가 뜨는 경우 위 myApp.kt에 젤 윗줄을 참고하자. (내가 여기서 에러가 떴다.)
PreferenceUtil.kt
package com.example.패키지명
import android.content.Context
import android.content.SharedPreferences
class PreferenceUtil(context: Context) {
private val prefs: SharedPreferences =
context.getSharedPreferences("prefs_name", Context.MODE_PRIVATE)
fun getString(key: String, defValue: String): String {
return prefs.getString(key, defValue).toString()
}
fun setString(key: String, str: String) {
prefs.edit().putString(key, str).apply()
이 부분은 실제로 데이터를 저장하고 불러오기 쉽게 하도록 캡슐화 하였다.
getString을 이용하여 데이터를 불러와서 사용할 수 있고,
setString을 이용하여 데이터를 저장할 수 있다.
이러면 완료이다. 실행해보기 위해 간단한 기능을 구현하였다.
MainActivity.kt
class MainActivity : AppCompatActivity() {
val binding by lazy{ ActivityMainBinding.inflate(layoutInflater)}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
binding.saveBtn.setOnClickListener {
myApp.prefs.setString("data",binding.editArea.text.toString())
}
binding.getBtn.setOnClickListener {
var data = myApp.prefs.getString("data", "")
binding.viewdata.text = data
}
}
}
EditText에 입력한 데이터를 저장버튼을 통해 데이터베이스에 저장하였다.
그리고 불러오는 버튼을 누르면 TextView에 저장된 데이터를 불러오도록 하였다.
실제론 RoomDB와 Firebase를 많이 사용할 것 같긴 하지만 그래도 알아놓으면 좋을 것 같다.
'Android' 카테고리의 다른 글
[Android] Kotlin Retrofit2 사용법 (0) | 2023.05.31 |
---|---|
[Android] Kotlin Context 란 ? (0) | 2023.05.31 |
[Android] 안드로이드 스튜디오 터미널 실행 안될 경우 (0) | 2023.05.29 |
[Android] Fragment 에서 뜬금없는 unresolved reference 에러 해결 (0) | 2023.05.29 |