ไลบรารี DataStore จะจัดเก็บข้อมูลแบบไม่พร้อมกัน สอดคล้องกัน และเป็นแบบธุรกรรม ซึ่งช่วยขจัดข้อเสียบางอย่างของ SharedPreferences หน้านี้มุ่งเน้นที่การสร้าง Datastore ในโปรเจ็กต์ Kotlin Multiplatform (KMP) ดูข้อมูลเพิ่มเติมเกี่ยวกับ DataStore ได้ที่เอกสารประกอบหลักสําหรับ DataStore และตัวอย่างอย่างเป็นทางการ
การตั้งค่าทรัพยากร Dependency
DataStore รองรับ KMP ในเวอร์ชัน 1.1.0 ขึ้นไป
หากต้องการตั้งค่า DataStore ในโปรเจ็กต์ KMP ให้เพิ่มการพึ่งพาสำหรับอาร์ติแฟกต์ในไฟล์ build.gradle.kts
ของโมดูล ดังนี้
androidx.datastore:datastore
- ไลบรารี DataStoreandroidx.datastore:datastore-preferences
- ไลบรารี Preferences DataStore
กำหนดคลาส DataStore
คุณสามารถกําหนดคลาส DataStore
ด้วย DataStoreFactory
ภายในแหล่งที่มาทั่วไปของโมดูล KMP ที่แชร์ การวางชั้นเรียนเหล่านี้ในแหล่งที่มาทั่วไปจะช่วยให้แชร์ชั้นเรียนในแพลตฟอร์มเป้าหมายทั้งหมดได้ คุณสามารถใช้การประกาศ actual
และ expect
เพื่อสร้างการใช้งานเฉพาะแพลตฟอร์ม
สร้างอินสแตนซ์ DataStore
คุณต้องกำหนดวิธีสร้างอินสแตนซ์ออบเจ็กต์ DataStore ในแต่ละแพลตฟอร์ม นี่เป็นส่วนที่เดียวของ API ที่ต้องอยู่ในชุดแหล่งที่มาของแพลตฟอร์มที่เฉพาะเจาะจงเนื่องจากความแตกต่างของ File System 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 คุณต้องมีโรงงาน DataStore พร้อมกับเส้นทาง 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"
}
)