DataStore (Kotlin 멀티플랫폼)

Datastore 라이브러리는 데이터를 비동기적이고 일관성 있게 저장하며 트랜잭션 방식으로 SharedPreferences의 단점을 일부 극복했습니다. 이 페이지는 Kotlin 멀티플랫폼 (KMP) 프로젝트에서 DataStore를 만드는 데 중점을 둡니다. DataStore에 관한 자세한 내용은 DataStore의 기본 문서공식 샘플

종속 항목 설정

DataStore는 버전 1.1.0 이상에서 KMP를 지원합니다.

KMP 프로젝트에서 Datastore를 설정하려면 아티팩트의 종속 항목을 추가하세요. 모듈의 build.gradle.kts 파일에서 다음을 실행합니다.

  • androidx.datastore:datastore - DataStore 라이브러리
  • androidx.datastore:datastore-preferences - Preferences DataStore 라이브러리

DataStore 클래스 정의

공통DataStoreDataStoreFactory 공유 KMP 모듈의 소스입니다. 이러한 클래스를 공통 소스에 배치 모든 타겟 플랫폼에서 공유할 수 있습니다 이때 만들 actualexpect 선언 플랫폼별 구현을 제공합니다.

DataStore 인스턴스 만들기

각 플랫폼에서 DataStore 객체를 인스턴스화하는 방법을 정의해야 합니다. 이는 API에서 특정 플랫폼에 있어야 하는 유일한 부분입니다. 파일 시스템 API의 차이로 인해 대체되었습니다.

일반

// shared/src/androidMain/kotlin/createDataStore.kt

/**
 * Gets the singleton DataStore instance, creating it if necessary.
 */
fun createDataStore(producePath: () -> String): DataStore<Preferences> =
        PreferenceDataStoreFactory.createWithPath(
            produceFile = { producePath().toPath() }
        )

internal const val dataStoreFileName = "dice.preferences_pb"

Android

DataStore 인스턴스를 만들려면 Context을 파일 경로를 지정합니다.

// shared/src/androidMain/kotlin/createDataStore.android.kt

fun createDataStore(context: Context): DataStore<Preferences> = createDataStore(
    producePath = { context.filesDir.resolve(dataStoreFileName).absolutePath }
)

iOS

DataStore 인스턴스를 만들려면 데이터베이스 경로

// shared/src/iosMain/kotlin/createDataStore.kt

fun createDataStore(): DataStore<Preferences> = createDataStore(
    producePath = {
        val documentDirectory: NSURL? = NSFileManager.defaultManager.URLForDirectory(
            directory = NSDocumentDirectory,
            inDomain = NSUserDomainMask,
            appropriateForURL = null,
            create = false,
            error = null,
        )
        requireNotNull(documentDirectory).path + "/$dataStoreFileName"
    }
)