문서의 이전 판입니다!
목차
서론
앱과 관련된 데이터를 램이 아닌 낸드와 같은 영구저장장치(보조저장장치)에 저장한 후 이를 재사용하고 싶을 때가 있다.
이를테면 앱의 테마 색깔을 계속 유지하고 싶다거나, 아니면 세이브 파일 부터 이어서 게임을 하고 싶다거나 등의 경우가 생길 수 있다.
이렇게 앱이 종료된 이후에도 계속하여 데이터를 보조저장장치에 저장한 후에 앱이 재사용될 때에 불러오는 것은 세가지 방법을 떠올릴 수 있을 것이다.
1. 파일에 저장하기
전통적인 방법은 파일을 직접 제어하여 문자열을 저장한 후에, 이를 다시 불러오는 것이다. 이를테면, 자바의 file
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내에서 사용하기
로그인