목차

개요

Android에서 설정 등을 기록하고 불러오는 기능을 말한다. 과거에 shared preference라는 이름으로 제공하던 api가

현재는 Datastore라는 이름으로 변경되었다.

필요한 의존성 파일

datastore api와, lifecycle api가 필요하다. 당음과 같다.

모듈단계의 그래들 파일에 다음의 의존성을 추가한다.

    // DataStore
    // Alternatively - use the following artifact without an Android dependency.
    implementation("androidx.datastore:datastore-preferences:1.2.0-alpha01")
    val lifecycle_version = "2.5.1"
    implementation("androidx.lifecycle:lifecycle-runtime-compose:$lifecycle_version")

Datastore 클래스 Helper 클래스 만들기

1. 소스파일

다음과 같이 헬퍼 클래스를 만들어서 읽기와 쓰기를 한다.

"DatastoreMemorize.kt"
package com.dklaw.memorize.database
 
import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.core.IOException
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.preferencesDataStore
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.map
 
class DataStoreMemorize(private val context : Context) {
 
    private val Context.dataStore : DataStore<Preferences> by preferencesDataStore(name = "appPreferences")
 
    private val FILTER_ON = booleanPreferencesKey("FilterOn") // string 저장 키값
 
    // Datastore 읽기
    // Flow : coroutines.flow import 해야됨
    val valueOfFilter : Flow<Boolean> = context.dataStore.data
        .map {preferences ->
            preferences[FILTER_ON] ?: false
        }
 
 
 
    // Datastore 쓰기
    suspend fun setFilterSwitch(switch : Boolean){
        context.dataStore.edit { preferences->
            preferences[FILTER_ON] = switch
        }
 
    }
 
}

2. 인스턴스 생성하기

“appPreferences”란 이름의 Datastore 인스턴스를 다음과 같이 생성한다. Datastore는 한 앱당 하나의 인스턴스만 싱글톤으로 사용되어야 하므로 호출에 있어서는 굳이 이름이 필요 없을 것이다. 다만, 유지보수 관점에서 기존의 Datastore와는 다른 새로운 Datastore 인스턴스를 만들어야 할 필요도 있을 것이므로 이름은 필요할 것이다.

    private val Context.dataStore : DataStore<Preferences> by preferencesDataStore(name = "appPreferences")

3. 키값의 제목 설정하기

Datastore는 [키, 밸류]의 쌍으로 데이터를 저장한다. 이를테면 C#의 Dictionary와 매우 비슷한 구조인 것이다.

즉, 각 키별로 형식이 존재한다. 이를테면 int값을 저장할 때에는 intPreferencesKey라고 하고, boolean값을 저장할 때에는 booleanPreferencesKey라고 한다.

우리는 boolean값을 “FILTER_ON” 이란 이름으로 저장할 것이다. 따라서 다음과 같이 키를 정의하게 된다.

    private val FILTER_ON = booleanPreferencesKey("FilterOn") // string 저장 키값

싱글턴으로 만들기

===== 실제 compose내에서 사용하기