Android DataStore

사용 언어: Kotlin 1.8.10
사용 버전: Android Studio Flamingo 2022.2.1

안드로이드 DataStore을 알아보겠습니다.


안드로이드에서 간단한 데이터를 저장하기 위해 SharedPreferences를 사용합니다.
하지만, Android Jetpack에서 DataStore를 만들면서 SharedPreferences 대신에 DataStore를 사용하기를 권장하고 있습니다.




DataStore에는 Preferences DataStore와 Proto DataStore가 있습니다.

Preferences DataStore는 SharedPreferences와 같이 key, value 형식으로 불러오며, null을 다뤄야 합니다.

Proto DataStore는 null이 없으며 사용자 정의 데이터 타입을 다룹니다. 그리고 protocol buffers라는 schema를 미리 만들어야 합니다.


여기서는 Preferences DataStore만 다루겠습니다.


DataStore를 사용할 때 다음 사항을 따라야 합니다.

1. 하나 이상의 instance를 같은 프로세스 안에서 만들지 않습니다.

2. 타입을 변경하지 않습니다. 타입 변경이 필요한 경우 protocol buffers를 사용합니다.

3. SingleProcessDataStore와 MultiProcessDataStore를 섞어서 사용하지 않습니다. 여러 프로세스가 접근하려면 MultiProcessDataStore를 사용합니다.




앱 용 Gradle에 아래와 같이 정의합니다.





저는 RxJava를 사용하지 않아서 그냥 한 줄만 추가했습니다.

implementation "androidx.datastore:datastore-preferences:1.0.0"





DataStore를 적용해 봅시다.

아래의 화면을 사용할 겁니다.

test button에 DataStore에서 저장한 값을 보여주고,

CLICK을 누르면 저장한 값에 1 더한 값을 저장합니다.





MainActivity 밖에 변수를 하나 만듭니다.

name에는 원하는 이름을 넣어줍니다.

Context.dataStore: DataStore<Preferences> by preferencesDataStore(name="number")






해당 내용은 빠르게 정의할수록 좋습니다. 그래서 MainActivity.kt 파일에 했습니다.



그다음, 저는 Fragment를 사용하기 때문에 Fragment로 갑니다.


dataStore는 Flow로 데이터를 주기 때문에 viewModel이 필요합니다.



그리고 저장을 위한 파일을 하나 만듭니다.

data 패키지를 만들고, kotlin 파일을 만듭니다.

마우스 우클릭 - New - Kotlin Class/File







적당한 이름으로 만듭니다.

저는 UserPreferencesRepository로 만들었습니다.






입력 인자로 dataStore: DataStore<Preferences>를 받습니다.






그다음, PreferencesKeys를 만듭니다. 여기에는 우리가 사용할 preferencesKey 값을 정의합니다.

intPreferencesKey()를 사용하는 이유는 int를 저장할 것이기 때문입니다. 그리고 name은 저장하고 싶은 이름으로 적습니다.






이제, DataStore를 읽어 봅시다.

22 번째 줄처럼 Flow를 만들고 dataStore.data를 합니다.

읽는 동안 오류가 발생할 수 있으므로 23 번째 줄처럼 catch를 사용합니다.

그리고 30 번째 줄처럼 map을 사용해서 전체 DataStore 값 중에서 PreferencesKeys.BLOG_COUNT만 가져옵니다. null이 있을 수 있으므로 0으로 초기화해줍니다.






이제, 쓰기를 해봅시다.

35 번째 줄처럼 suspend로 만듭니다. dataStore.edit을 사용하는데, 이게 suspend가 필요합니다.

38 번째 줄처럼 값을 넣어주면 됩니다.






제 Fragment는 이렇게 viewModel을 만들었습니다.





이제, ViewModel로 갑니다.


19 번째 줄처럼 asLiveData를 사용하여 countPreferencesFlow를 LiveData로 만듭니다.

23 번째 줄처럼 버튼을 누르면 숫자 1이 증가하는 코드를 넣습니다. suspend 함수를 부르기 때문에 launch를 사용합니다.







다시 Fragment로 돌아옵니다.

onViewCreated에 45 번째 줄처럼 liveData를 observe 합니다.

49 번째 줄처럼 버튼을 누르면 숫자 1을 증가시킵니다.





실행해 봅시다.




앱을 종료해도 숫자가 유지되는 것을 볼 수 있습니다.



끝.


카테고리: Android


댓글

이 블로그의 인기 게시물

Python OpenCV 빈 화면 만들기

Python urllib.parse.quote()

Python bytes.fromhex()

Android AVD Ram size change

Forensics .pyc 파일 .py로 복구하기

Android Minimum touch target size

KiCad 시작하기 7 (FreeRoute 사용하기 2)

Android Notification with Full Screen

C++ OpenCV 모폴로지 침식, 팽창

KiCad 시작하기 2 (PCB 만들기)