카테고리 없음
[Android] DataStore
Jun.LEE
2024. 4. 5. 20:34
안드로이드 개발자 페이지 DataStore를 참고하였다.
앱 아키텍처: 데이터 영역 - Datastore - Android 개발자 | Android Developers
데이터 영역 라이브러리에 관한 이 앱 아키텍처 가이드를 통해 Preferences DataStore 및 Proto DataStore, 설정 등을 알아보세요.
developer.android.com
Room 보다는 가볍게 사용할 수 있는 내부 저장소 DataStore를 구성해보려고 한다.
기존에 SharedPreference의 대체재로서 등장한 녀석이다.
DataStore는 Preferences DataStore, Proto DataStore 두 가지로 나누어 설명되고 있다.
둘의 차이는 Type Safety의 유무되시겠다.
먼저 Type Safety가 없는 Preferences DataStore를 살펴보도록 하자.
data repository에서 접근하도록 할 예정인데 datastore의 경우 context에 dependency가 있다.
context의 확장함수로 작성해주자.
data class Employee(
val name: String,
val age: String,
val salary: String
)
private val Context.dataStore by preferencesDataStore(name = "employee")
class EmployeeRepository(
private val context: Context
) {
}
이후에 preference datastore의 경우 단순히 key-value 쌍을 저장하는 용도이므로
key-value만 잘 작성해주시면 되겠다.
private val Context.dataStore by preferencesDataStore(name = "employee")
class EmployeeRepository(
private val context: Context
) {
private object PreferencesKeys {
val NAME = stringPreferencesKey("name")
val AGE = stringPreferencesKey("age")
val SALARY = stringPreferencesKey("salary")
}
val employee: Flow<Employee> = context.dataStore.data.map { preferences ->
Employee(
name = preferences[PreferencesKeys.NAME]?: "",
age = preferences[PreferencesKeys.AGE]?: "",
salary = preferences[PreferencesKeys.SALARY]?: ""
)
}
suspend fun setEmployee(employee: Employee) {
context.dataStore.edit { settings ->
settings[PreferencesKeys.NAME] = employee.name
settings[PreferencesKeys.AGE] = employee.age
settings[PreferencesKeys.SALARY] = employee.salary
}
}
}
위와 같이 data class를 IO해도 되고 직렬화, 역직렬화 알고리즘을 통하여 string으로 IO해도 되겠다.