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 클래스 정의

공유 KMP 모듈의 공통 소스 내에서 DataStoreFactoryDataStore 클래스를 정의할 수 있습니다. 이러한 클래스를 공통 소스에 배치하면 모든 타겟 플랫폼에서 공유될 수 있습니다. 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"
    }
)