Data Store

2023. 7. 25. 11:28개발/Android

What is DataStore

  • SharedPreferences의 대체제
  • Kotlin&Coroutine&Flow사용
  • 데이터를 비동기식으로 저장함

DataStore을 사용하는 이유

  • SharedPreferences는 Main스레드로부터 안전하지않음….→ DataStore은 Dispatchers.IO를 사용해 UI스레드를 사용한다~
  • runtime exception으로부터 안전하다
  • SharedPreferences로부터의 migration을 지원한다
  • Protocol buffer를 사용해서 Type safety를 지원한다!

DataStore이 지원하는 두 가지 유형

Preference DataStore

  • key / value 값 쌍을 사용해 데이터를 저장함. but 형식 안전성을 제공하지는 않음

Proto DataStore

  • 프로토콜 버퍼를 사용해 지정된 스키마가 있는 사용자 지정 유형으로 데이터 저장

샘플소스

→ 다음은 다크/라이트 모드를 저장하는 샘플 소스

  1. Dependency
dependencies {
    // Preferences DataStore
    implementation "androidx.datastore:datastore-preferences:1.0.0-alpha01"
}

  1. 모드 enum 클래스 생성
enum class UiMode { 
    LIGHT , DARK
 }

  1. DataSource 생성
class SettingsManager(context: Context) {

    private val dataStore = context.createDataStore(name = "settings_pref")
    ...

  1. 저장을 위한 키 만들어줌
companion object {
    val IS_DARK_MODE = preferencesKey<Boolean>("dark_mode")
}

  1. 업데이트는 요렇게
suspend fun setUiMode(uiMode: UiMode) {
    dataStore.edit { preferences ->
        preferences[IS_DARK_MODE] = when (uiMode) {
            UiMode.LIGHT -> false
            UiMode.DARK -> true
        }
    }
}

  1. Flow 로 가져오기. → 상태 관찰 가능!
val uiModeFlow: Flow<UiMode> = dataStore.data
    .catch {
        if (it is IOException) {
            it.printStackTrace()
            emit(emptyPreferences())
        } else {
            throw it
        }
    }
    .map { preference ->
        val isDarkMode = preference[IS_DARK_MODE] ?: false

        when (isDarkMode) {
            true -> UiMode.DARK
            false -> UiMode.LIGHT
        }
    }
private fun observeUiPreferences() {
        settingsManager.uiModeFlow.asLiveData().observe(this) { uiMode ->
            when (uiMode) {
                UiMode.LIGHT -> onLightMode()
                UiMode.DARK -> onDarkMode()
            }
        }
    }

→ 요런식으로~


Uploaded by N2T

'개발 > Android' 카테고리의 다른 글

Using Room (With HILT)  (0) 2023.07.25
Memory leaks  (0) 2023.07.25
6 Design Patterns Every Android Developer Must Know  (0) 2023.05.03
알아두면 좋은 Kotlin extension  (0) 2023.05.03
DiffUtil로 RecyclerView효율화하기  (0) 2023.05.03