Android Academy · บทเรียน

DataStore เทียบกับ SharedPreferences

เหตุผลที่ DataStore เป็นตัวเลือกสมัยใหม่

บทเรียน 1 จาก 413 ขั้นตอน

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

จัดเก็บการตั้งค่าขนาดเล็ก

แอปเกือบทุกแอปต้องจดจำข้อมูลเล็ก ๆ น้อย ๆ เช่น ปุ่มสลับโหมดมืด แท็บที่ใช้ล่าสุด หรือชื่อผู้ใช้ ข้อมูลเหล่านี้คือ ค่ากำหนดแบบคีย์-ค่า ไม่ใช่ข้อมูลเชิงสัมพันธ์ขนาดใหญ่

Android ใช้ SharedPreferences สำหรับงานนี้มาหลายปี ปัจจุบันโซลูชันที่แนะนำคือ DataStore

SharedPreferences คืออะไร

SharedPreferences คือที่เก็บข้อมูลแบบคีย์-ค่าที่ใช้ XML เป็นพื้นฐาน คุณจะได้รับตัวแก้ไข ใส่ค่า และยืนยันการบันทึก

  • ใช้งานง่าย
  • มีอยู่ในเฟรมเวิร์กอยู่แล้ว
  • มี API แบบทำงานพร้อมกัน ซึ่งอาจบล็อกเธรด UI
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
prefs.edit().putBoolean("dark_mode", true).apply()
val dark = prefs.getBoolean("dark_mode", false)

ปัญหาของ SharedPreferences

SharedPreferences มีข้อจำกัดที่สำคัญดังนี้:

  • การอ่านด้วย getX() อาจบล็อกเธรดที่เรียกใช้ (ซึ่งมักเป็นเธรดหลัก)
  • commit() ทำ I/O กับดิสก์แบบทำงานพร้อมกัน
  • ไม่มีวิธีในตัวสำหรับแจ้งข้อผิดพลาด
  • API ไม่ปลอดภัยด้านชนิดข้อมูลและไม่ตอบสนองต่อการเปลี่ยนแปลง

เริ่มใช้ DataStore

DataStore เป็นสิ่งทดแทนสมัยใหม่ที่สร้างบน Kotlin coroutines และ Flow โดยทำงานกับดิสก์ทั้งหมดนอกเธรดหลัก และเปิดเผยข้อมูลเป็นกระแสที่สังเกตการเปลี่ยนแปลงได้

มี 2 รูปแบบ ได้แก่ Preferences DataStore (คีย์-ค่า) และ Proto DataStore (ออบเจ็กต์ที่มีชนิดข้อมูลกำกับ)

ออกแบบมาให้ทำงานแบบอะซิงโครนัส

DataStore จะไม่บล็อก UI การอ่านข้อมูลจะมาผ่าน Flow ที่คุณรวบรวมค่า ส่วนการเขียนข้อมูลเป็นฟังก์ชัน suspend ที่เรียกใช้จาก coroutine

นั่นหมายความว่าการอ่านและเขียนการตั้งค่าจะปลอดภัยแม้ทำงานบนเธรดหลัก เพราะงานหนักจะทำงานบนตัวจัดส่งเบื้องหลัง

val darkMode: Flow<Boolean> = dataStore.data
    .map { prefs -> prefs[DARK_MODE_KEY] ?: false }

อัปเดตแบบตอบสนอง

เนื่องจาก DataStore เปิดเผยข้อมูลเป็น Flow UI ของคุณจึงอัปเดตโดยอัตโนมัติเมื่อค่ามีการเปลี่ยนแปลง ส่วน SharedPreferences คุณต้องลงทะเบียนตัวรับฟังการเปลี่ยนแปลงที่ใช้งานยุ่งยาก

ใน Jetpack Compose เพียงใช้ collectAsState() กับโฟลว์ แล้วหน้าจอจะจัดองค์ประกอบใหม่ทุกครั้งที่มีการอัปเดต

ทำงานแบบธุรกรรมและมีความสอดคล้อง

การเขียนข้อมูลของ DataStore เป็นแบบ ธุรกรรม การอัปเดตจะสำเร็จทั้งหมดหรือล้มเหลวทั้งหมด คุณจึงไม่ต้องอ่านค่าที่เขียนค้างไว้เพียงบางส่วน

นอกจากนี้ยังรับประกันความสอดคล้องของข้อมูลระหว่างการอ่านและการเขียนหลายครั้งภายในโปรเซสเดียวกัน

การจัดการข้อผิดพลาด

SharedPreferences มักกลืนปัญหา I/O ไว้โดยไม่แจ้งให้ทราบ ส่วน DataStore จะแสดงปัญหาเหล่านั้น: การอ่านอาจส่ง IOException ผ่านโฟลว์ ซึ่งคุณสามารถใช้ catch เพื่อจัดการและกู้คืนได้

val settings: Flow<Settings> = dataStore.data
    .catch { e ->
        if (e is IOException) emit(emptyPreferences())
        else throw e
    }
    .map { /* map to your model */ }

เมื่อ DataStore ไม่ใช่คำตอบ

DataStore เหมาะสำหรับข้อมูลแบบคีย์-ค่าหรือข้อมูลที่มีชนิดข้อมูลกำกับ ซึ่งมีขนาดเล็กถึงปานกลาง แต่ไม่ใช่ฐานข้อมูล

  • ชุดข้อมูลขนาดใหญ่ การค้นหา และความสัมพันธ์: ใช้ Room
  • ไฟล์ รูปภาพ และสื่อ: ใช้ระบบไฟล์
  • การตั้งค่าจำนวนไม่มาก: ใช้ DataStore

การเพิ่มส่วนพึ่งพา

หากต้องการใช้ Preferences DataStore ให้เพิ่มอาร์ติแฟกต์ลงในไฟล์ Gradle ของโมดูล โดย Proto DataStore มีอาร์ติแฟกต์แยกต่างหาก

dependencies {
    implementation("androidx.datastore:datastore-preferences:1.1.1")
}

การย้ายข้อมูลจาก SharedPreferences

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

val Context.dataStore by preferencesDataStore(
    name = "settings",
    produceMigrations = { context ->
        listOf(SharedPreferencesMigration(context, "settings"))
    }
)

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

ทดสอบความเข้าใจของคุณเกี่ยวกับเหตุผลที่ควรเลือกใช้ DataStore

สรุปทบทวน

คุณได้เรียนรู้เหตุผลที่ DataStore เป็นตัวเลือกสมัยใหม่สำหรับการตั้งค่าแบบคีย์-ค่า:

  • SharedPreferences อาจบล็อกเธรดหลักและไม่ตอบสนองต่อการเปลี่ยนแปลง
  • DataStore ใช้โครูทีนและ Flow เพื่อเข้าถึงข้อมูลแบบอะซิงโครนัสอย่างปลอดภัย
  • การเขียนข้อมูลเป็นธุรกรรม พร้อมการจัดการข้อผิดพลาดที่เหมาะสม
  • มีอยู่สองรูปแบบ ได้แก่ Preferences และ Proto

ถัดไป คุณจะได้ใช้งานดีลีเกต preferencesDataStore ในทางปฏิบัติ

เริ่มต้นได้ฟรี

เรียนรู้ Kotlin ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
36
บทเรียน
152

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

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

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

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

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

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

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

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

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

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

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

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

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