DataStore เทียบกับ SharedPreferences
เหตุผลที่ DataStore เป็นตัวเลือกสมัยใหม่
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- DataStore เทียบกับ SharedPreferences
- Preferences DataStore
- การอ่านและเขียนการตั้งค่า
- Proto DataStore