[Android] Datastore에 대하여(SharedPreferences,Preferences DataStore,Proto DataStore)

김민주·2022년 12월 28일
0

Android

목록 보기
21/21

Data를 App 저장하는 방법

  1. 파일 내부/외부 저장소에 저장
  2. RDB 관계형데이터베이스 (ex.SQLite)
  3. SharedPreferences : Key-Value 형태

SharedPreferences

저장하려는 키-값 collection이 작은 경우 SharedPreferences를 이용한다.

  • Handler

새로운 공유 환경설정 파일을 생성하거나 기존 파일에 access 할 수 있다.

getSharedPreferences()
val sharedPref = activity?.getSharedPreferences( getString(R.string.preference_file_key), Context.MODE_PRIVATE)
getPreferences()
val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE)

  • Write
val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
with (sharedPref.edit()) {
    putInt(getString(R.string.saved_high_score_key), newHighScore)
    apply()
}
  • Read
val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE) ?: return
val defaultValue = resources.getInteger(R.integer.saved_high_score_default_key)
val highScore = sharedPref.getInt(getString(R.string.saved_high_score_key), defaultValue)

DataStore

  1. 같은 프로세스에서 Datastore 인스턴스를 2개 이상 만들지 않음(여러 개 활성화되어 있으면 데이터 read/update시 Datastore가 IllegalStateException을 발생시킴)
  2. Datastore의 일반 유형은 변경 불가능함(불변성을 보장하고 간단한 API와 효율적인 직렬화를 제공하는 프로토콜 버퍼를 사용하는 것을 권장)
  3. SingleProcessDataStore와 MultiProcessDataStore를 함께 사용하지 않음

Preferences DataStore

  • Key를 사용하여 데이터를 저장하고 access함
  • Proto datastore보다 가벼운 프로젝트에서 사용함
  • SharedPreference를 대체하기 위함

사용법

  1. gradle에서 dependency 추가
    implementation("androidx.datastore:datastore-preferences:1.0.0")
  2. Preferences DataStore 생성
  3. Preferences DataStore에서 읽기
 override suspend fun getSort(): Flow<String> {
        return dataStore.data.catch { exception ->
            if (exception is IOException) {
                exception.printStackTrace()
                emit(emptyPreferences())
            } else {
                throw exception
            }
        }.map {
            it[SORT_MODE] ?: Sort.ACCURACY.by
        }
    }
  1. Preferences DataStore에 쓰기
override suspend fun saveSort(mode: String) {
        dataStore.edit { setting ->
            setting[SORT_MODE] = mode
        }
  1. Fragment에서 값 읽고 쓰려면

Proto DataStore

  • 맞춤형 데이터유형의 인스턴스로 데이터를 저장함 (클래스의 객체로 저장 가능)
  • DataStore 인터페이스를 구현하는 간단한 데이터를 key value 쌍으로 저장하기 위함
  • 프로토콜 버퍼를 사용함
  • data의 Type Safety를 보장함

사용법

  1. gradle에서 dependency 추가
  2. 스키마 정의
  3. 프로토 클래스를 위한 Serializer 생성
  4. 프로토 데이터스토어 생성





https://developer.android.com/topic/libraries/architecture/datastore?hl=ko
https://www.inflearn.com/course/%EC%95%8C%EA%B8%B0%EC%89%AC%EC%9A%B4-modern-android/unit/112163

profile
𝐃𝐨𝐧'𝐭 𝐛𝐞 𝐚 𝐩𝐫𝐨𝐜𝐫𝐚𝐬𝐭𝐢𝐧𝐚𝐭𝐨𝐫💫

0개의 댓글