카테고리 없음

[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해도 되겠다.