DataStore (Kotlin หลายแพลตฟอร์ม)

ไลบรารี DataStore จะจัดเก็บข้อมูลแบบไม่พร้อมกัน สอดคล้องกัน และเป็นแบบธุรกรรม ซึ่งช่วยขจัดข้อเสียบางอย่างของ SharedPreferences หน้านี้มุ่งเน้นที่การสร้าง Datastore ในโปรเจ็กต์ Kotlin Multiplatform (KMP) ดูข้อมูลเพิ่มเติมเกี่ยวกับ DataStore ได้ที่เอกสารประกอบหลักสำหรับ DataStore และตัวอย่างอย่างเป็นทางการ

ตั้งค่าทรัพยากร Dependency

หากต้องการตั้งค่า DataStore ในโปรเจ็กต์ KMP ให้เพิ่มการพึ่งพาสำหรับอาร์ติแฟกต์ในไฟล์ build.gradle.kts ของโมดูล ดังนี้

commonMain.dependencies {
  // DataStore library
  implementation("androidx.datastore:datastore:1.1.7")
  // The Preferences DataStore library
  implementation("androidx.datastore:datastore-preferences:1.1.7")
}

กำหนดคลาส DataStore

คุณสามารถกําหนดคลาส DataStore ด้วย DataStoreFactory ภายในแหล่งที่มาทั่วไปของโมดูล KMP ที่แชร์ การวางคลาสเหล่านี้ในแหล่งที่มาทั่วไปจะช่วยให้แชร์คลาสเหล่านั้นในแพลตฟอร์มเป้าหมายทั้งหมดได้ คุณสามารถใช้ประกาศ actual และ expect เพื่อสร้างการใช้งานเฉพาะแพลตฟอร์ม

สร้างอินสแตนซ์ DataStore

คุณต้องกําหนดวิธีสร้างอินสแตนซ์ออบเจ็กต์ DataStore ในแต่ละแพลตฟอร์ม นี่เป็นส่วนที่เดียวของ API ที่ต้องอยู่ในชุดแหล่งที่มาของแพลตฟอร์มที่เฉพาะเจาะจงเนื่องจากความแตกต่างของ File System API

ทั่วไป

// shared/src/commonMain/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 ใน Android คุณต้องมี Context พร้อมกับเส้นทาง

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

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

iOS

ใน iOS คุณสามารถเรียกดูเส้นทางจาก NSDocumentDirectory ดังนี้

// shared/src/iosMain/kotlin/createDataStore.ios.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"
    }
)

JVM (เดสก์ท็อป)

หากต้องการสร้างอินสแตนซ์ DataStore ใน JVM (เดสก์ท็อป) ให้ระบุเส้นทางโดยใช้ Java หรือ Kotlin API ดังนี้

// shared/src/jvmMain/kotlin/createDataStore.desktop.kt

fun createDataStore(): DataStore<Preferences> = createDataStore(
    producePath = {
      val file = File(System.getProperty("java.io.tmpdir"), dataStoreFileName)
      file.absolutePath
    }
)
แทนได้