0Pricing
Android Academy · บทเรียน

Preferences DataStore

จัดเก็บการตั้งค่าแบบคีย์-ค่าอย่างเป็นรีแอกทีฟ

Preferences DataStore เป็นบทเรียน Android Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Android Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน

Preferences DataStore

Preferences DataStore จัดเก็บคู่คีย์-ค่าอย่างง่าย เช่นเดียวกับ SharedPreferences แต่ใช้ส่วนเชื่อมต่อแบบอะซิงโครนัสสมัยใหม่ โดยไม่ได้บังคับสคีมาหรือความปลอดภัยด้านชนิดข้อมูลกับอ็อบเจ็กต์ทั้งหมด

คุณเข้าถึงค่าต่าง ๆ ผ่านคีย์ที่ระบุชนิดข้อมูล

การสร้าง DataStore

คุณสร้างอินสแตนซ์ DataStore เพียงหนึ่งรายการต่อไฟล์ โดยใช้ดีลีเกตพร็อพเพอร์ตี preferencesDataStore ที่ระดับบนสุดของไฟล์ Kotlin ค่า name จะกลายเป็นชื่อไฟล์บนดิสก์

import androidx.datastore.preferences.preferencesDataStore
import androidx.datastore.preferences.core.Preferences

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

เหตุผลที่ใช้ดีลีเกตระดับบนสุด

ดีลีเกตช่วยรับรองว่าในกระบวนการของคุณจะมีอินสแตนซ์ DataStore สำหรับชื่อไฟล์นั้นเพียงหนึ่งรายการ การสร้างอีกสองรายการสำหรับไฟล์เดียวกันจะทำให้เกิดข้อผิดพลาด เพราะทั้งสองรายการจะแย่งกันจัดการข้อมูลเดียวกัน

การประกาศเป็นส่วนขยายของ Context ที่ระดับบนสุดช่วยให้เป็นซิงเกิลตัน

คีย์การตั้งค่า

ค่าแต่ละค่าต้องมีคีย์ที่ระบุชนิดข้อมูล คีย์จะทำหน้าที่ทั้งตั้งชื่อรายการและกำหนดชนิดข้อมูลให้แน่นอน ฟังก์ชันตัวช่วยจะสร้างคีย์สำหรับชนิดข้อมูลที่รองรับแต่ละชนิด

import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.intPreferencesKey

val USERNAME = stringPreferencesKey("username")
val DARK_MODE = booleanPreferencesKey("dark_mode")
val LAUNCH_COUNT = intPreferencesKey("launch_count")

ชนิดคีย์ที่รองรับ

Preferences DataStore รองรับชนิดคีย์พื้นฐานต่อไปนี้:

  • stringPreferencesKey
  • booleanPreferencesKey
  • intPreferencesKey, longPreferencesKey, floatPreferencesKey, doublePreferencesKey
  • stringSetPreferencesKey

กำหนดคีย์ไว้ในที่เดียว

รูปแบบที่นิยมคือรวบรวมคีย์ทั้งหมดไว้ใน object เพื่อให้ค้นหาและนำกลับมาใช้ได้ง่าย และช่วยหลีกเลี่ยงการพิมพ์ชื่อสตริงผิด

object PrefKeys {
    val USERNAME = stringPreferencesKey("username")
    val DARK_MODE = booleanPreferencesKey("dark_mode")
    val FONT_SIZE = intPreferencesKey("font_size")
}

คีย์สตริงกับชื่อตัวแปร

โปรดจำไว้ว่าอาร์กิวเมนต์สตริง เช่น "dark_mode" คือสิ่งที่จะถูกเขียนลงดิสก์ หากคุณเปลี่ยนชื่อในภายหลัง ค่าที่มีอยู่เดิมจะไม่สามารถเข้าถึงได้ ส่วนชื่อ val ใน Kotlin มีไว้ใช้ในโค้ดของคุณเท่านั้น

ใช้ DataStore แยกตามหน้าที่

คุณสามารถสร้าง DataStore หลายรายการสำหรับหน้าที่ที่แตกต่างกัน โดยแต่ละรายการมีชื่อไฟล์ของตัวเอง เช่น ที่เก็บ "settings" และที่เก็บ "user_session" ควรรวบรวมคีย์ที่เกี่ยวข้องไว้ด้วยกัน

val Context.settingsStore by preferencesDataStore(name = "settings")
val Context.sessionStore by preferencesDataStore(name = "session")

การเข้าถึงจากชั้นส่วนติดต่อผู้ใช้

แม้ดีลีเกตจะผูกอยู่กับ Context แต่ไม่ควรอ่านโดยตรงจาก Composable ให้แทรก DataStore เข้าไปในรีโพซิทอรี แล้วเปิดเผยโฟลว์ให้ ViewModel วิธีนี้ช่วยให้ทดสอบส่วนติดต่อผู้ใช้ได้

โครงสร้างรีโพซิทอรีอย่างง่าย

การห่อหุ้ม DataStore ไว้ในคลาสรีโพซิทอรีจะทำให้คุณมีส่วนเชื่อมต่อที่สะอาด และมีจุดเดียวสำหรับกำหนดคีย์กับตรรกะการแมปข้อมูล

class SettingsRepository(private val dataStore: DataStore<Preferences>) {
    val darkMode: Flow<Boolean> = dataStore.data
        .map { it[PrefKeys.DARK_MODE] ?: false }
}

ค่าเริ่มต้น

คีย์อาจยังไม่มีอยู่ ดังนั้นการอ่านจึงคืนค่าเป็น null ควรระบุค่าเริ่มต้นด้วยตัวดำเนินการ Elvis ?: เสมอเมื่อแมปค่าการตั้งค่า

val fontSize: Flow<Int> = dataStore.data
    .map { prefs -> prefs[PrefKeys.FONT_SIZE] ?: 14 }

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับคีย์การตั้งค่า

สรุปทบทวน

คุณได้ตั้งค่า Preferences DataStore แล้ว:

  • สร้างอินสแตนซ์หนึ่งรายการผ่านดีลีเกตระดับบนสุด preferencesDataStore
  • กำหนดคีย์ที่ระบุชนิดข้อมูลด้วย stringPreferencesKey, booleanPreferencesKey และอื่น ๆ
  • รวบรวมคีย์ไว้ใน object และห่อหุ้มการเข้าถึงไว้ในรีโพซิทอรี
  • ระบุค่าเริ่มต้นสำหรับคีย์ที่ไม่มีอยู่เสมอ

ถัดไป: อ่านและเขียนการตั้งค่าเหล่านั้นจริง ๆ

คำถามที่พบบ่อย

บทเรียน “Preferences DataStore” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “Preferences DataStore” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Android Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “Preferences DataStore”

จัดเก็บการตั้งค่าแบบคีย์-ค่าอย่างเป็นรีแอกทีฟ คุณปฏิบัติ Android Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Android Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Android Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “Preferences DataStore” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Android Academy นี้ได้ไหม

ได้ บทเรียน Android Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. DataStore เทียบกับ SharedPreferences
  2. Preferences DataStore
  3. การอ่านและเขียนการตั้งค่า
  4. Proto DataStore
← กลับไปที่ Android Academy