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
- 프로토콜 버퍼를 사용해 지정된 스키마가 있는 사용자 지정 유형으로 데이터 저장
샘플소스
→ 다음은 다크/라이트 모드를 저장하는 샘플 소스
- Dependency
dependencies {
// Preferences DataStore
implementation "androidx.datastore:datastore-preferences:1.0.0-alpha01"
}
- 모드 enum 클래스 생성
enum class UiMode {
LIGHT , DARK
}
- DataSource 생성
class SettingsManager(context: Context) {
private val dataStore = context.createDataStore(name = "settings_pref")
...
- 저장을 위한 키 만들어줌
companion object {
val IS_DARK_MODE = preferencesKey<Boolean>("dark_mode")
}
- 업데이트는 요렇게
suspend fun setUiMode(uiMode: UiMode) {
dataStore.edit { preferences ->
preferences[IS_DARK_MODE] = when (uiMode) {
UiMode.LIGHT -> false
UiMode.DARK -> true
}
}
}
- 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