Shared Preferences와 Datastore
Shared Preferences를 Datastore로 Migration 하기 위해서는 Datastore가 저장되는 공간에 Shared Preferences가 저장했던 정보를 다시 저장해야 한다. 이 뜻은 Shared Preferences를 Datastore로 이전 저장하기 위해 Migration 용 스펙을 정의해놓은 객체가 필요하다는 뜻이다.
Shared Preferences를 Datastore로 이전하는 작업은 보통 두가지 상황의 경우에 고려된다. 첫 째, Shared Preferences가 새로 만들 Datastore과 Dependency가 있어 같이 작업하는 것이 좋은 경우. 둘 째, Datastore에서 제공하는 Coroutines, Flow를 사용해야 하는 경우. 만약 호출 후 일회성으로 값을 받아오는 작업만 하면 충분하다면 굳이 Shared Preferences를 Datastore로 이전 하는 것은 Type Safety에 대한 장점 말고는 큰 의미가 없다. 잘 판단하여 Migration을 진행하는 것이 좋다.
Shared Preference에서 이전하기
이전 작업을 위해서는 SharedPreferenceMigration 객체를 만들어야 한다. 이 SharedPreferenceMigration 객체는 Datastore에 입력하는 객체로 Converting을 진행한다. 아래 //Migration 로직 작성이라는 부분에 Shared Preference의 값을 Datastore용 객체로 이전하는 로직을 작성하면 된다.
*OnBoardingState는 이전 글에서 이어지는 객체이다. 만약 이해가 안간다면 4번 글을 보고 오자
private val Context.sharedPrefsMigration: SharedPreferencesMigration<OnBoardingState>
get() = SharedPreferencesMigration(
this,
"PREF"
) { sharedPrefs: SharedPreferencesView, currentData: OnBoardingState ->
// Migration 로직 작성
}
이후에 produceMigrations 에 우리가 위에서 만든 sharedPrefsMigration 객체를 넣어주면 된다. produceMigrations는 입력값이 Context 인 lambda 이다.
val Context.storeOnBoardingState: DataStore<OnBoardingState> by dataStore(
fileName = "onboardingSettings.pb",
serializer = OnBoardingStateSerializer,
produceMigrations = {
listOf(it.sharedPrefsMigration)
}
)
여기까지 하면 Migration이 끝난다. 이 방식으로 Preference Datastore은 물론 Proto Datastore로의 Migration 또한 가능하다.