Proto DataStore
จัดเก็บข้อมูลมีโครงสร้างที่ระบุชนิด
Proto DataStore เป็นบทเรียน Android Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Android Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน
Proto DataStore
Proto DataStore จัดเก็บอ็อบเจ็กต์ที่มีโครงสร้างและระบุชนิดข้อมูลอย่างชัดเจน แทนคู่คีย์-ค่าแบบหลวม ๆ คุณกำหนดสคีมา แล้ว DataStore จะจัดเก็บอ็อบเจ็กต์ที่มีชนิดข้อมูลหนึ่งรายการต่อไฟล์
เหมาะอย่างยิ่งเมื่อการตั้งค่าของคุณรวมกันเป็นโมเดลที่สอดคล้องกัน
เหตุผลที่ข้อมูลมีชนิด
Preferences DataStore ไม่มีชนิดข้อมูลที่กำหนดไว้: การพิมพ์คีย์ผิดหรือการอ่านด้วยชนิดข้อมูลผิดจะล้มเหลวเมื่อโปรแกรมทำงานเท่านั้น Proto DataStore มอบความปลอดภัยด้านชนิดข้อมูลขณะคอมไพล์ให้กับอ็อบเจ็กต์การตั้งค่าทั้งหมด
- ไม่มีคีย์สตริงให้พิมพ์ผิด
- กำหนดค่าเริ่มต้นไว้ในสคีมา
- ฟิลด์ที่ปรับโครงสร้างใหม่ได้ง่าย
การเลือกรูปแบบซีเรียลไลเซอร์
แนวทางดั้งเดิมใช้ Protocol Buffers (proto) เพื่อกำหนดสคีมา นอกจากนี้คุณยังสามารถซีเรียลไลซ์ด้วย kotlinx.serialization หรือรูปแบบที่กำหนดเองใด ๆ ได้ สคีมาจะอธิบายฟิลด์และชนิดข้อมูล
การกำหนดสคีมา Proto
คุณเขียนไฟล์ .proto เพื่ออธิบายข้อความการตั้งค่า คอมไพเลอร์ protobuf จะสร้างคลาส Kotlin/Java จากไฟล์นั้น
syntax = "proto3";
option java_package = "com.example.app";
option java_multiple_files = true;
message UserSettings {
bool dark_mode = 1;
int32 font_size = 2;
string username = 3;
}การสร้างซีเรียลไลเซอร์
DataStore ต้องใช้ Serializer ที่รู้วิธีอ่านและเขียนชนิดข้อมูลของคุณลงในสตรีม รวมถึง defaultValue ที่ใช้เมื่อไฟล์ว่าง
object UserSettingsSerializer : Serializer<UserSettings> {
override val defaultValue: UserSettings = UserSettings.getDefaultInstance()
override suspend fun readFrom(input: InputStream): UserSettings =
UserSettings.parseFrom(input)
override suspend fun writeTo(t: UserSettings, output: OutputStream) =
t.writeTo(output)
}การสร้าง Proto DataStore
ใช้ดีลีเกต dataStore (ไม่ใช่ preferencesDataStore) โดยส่งชื่อไฟล์และซีเรียลไลเซอร์ของคุณเข้าไป
val Context.settingsStore: DataStore<UserSettings> by dataStore(
fileName = "user_settings.pb",
serializer = UserSettingsSerializer
)การอ่านข้อมูลที่มีชนิด
การอ่านข้อมูลทำผ่าน settingsStore.data แต่ตอนนี้ชนิดของโฟลว์คือโมเดลของคุณเอง ไม่ต้องใช้คีย์หรือการแปลงชนิด เพียงเข้าถึงฟิลด์ได้โดยตรง
val darkMode: Flow<Boolean> = context.settingsStore.data
.map { settings -> settings.darkMode }การเขียนด้วย updateData
Proto DataStore แทนที่ edit ด้วยฟังก์ชันระงับการทำงาน updateData คุณจะได้รับอ็อบเจ็กต์ปัจจุบันและส่งคืนอ็อบเจ็กต์ใหม่ สำหรับ protobuf ให้ใช้ตัวสร้างที่สร้างขึ้นโดยอัตโนมัติ
suspend fun setDarkMode(enabled: Boolean) {
context.settingsStore.updateData { current ->
current.toBuilder()
.setDarkMode(enabled)
.build()
}
}การอัปเดตแบบไม่เปลี่ยนแปลงค่าเดิม
โปรดสังเกตว่าคุณจะไม่แก้ไขอ็อบเจ็กต์เดิมโดยตรง แต่จะสร้างและส่งคืนอ็อบเจ็กต์ใหม่ ความไม่เปลี่ยนแปลงนี้ทำให้การอัปเดตเป็นธุรกรรมและสอดคล้องกันสำหรับผู้สังเกตการณ์ทุกตัว
การจัดการข้อมูลเสียหาย
หากไฟล์ที่จัดเก็บไว้อ่านไม่ได้ DataStore จะส่ง CorruptionException คุณสามารถระบุ corruptionHandler ที่ส่งคืนค่าเริ่มต้นที่ปลอดภัยแทนการทำให้แอปล่ม
val Context.settingsStore by dataStore(
fileName = "user_settings.pb",
serializer = UserSettingsSerializer,
corruptionHandler = ReplaceFileCorruptionHandler {
UserSettings.getDefaultInstance()
}
)Preferences เทียบกับ Proto
เลือกตามความต้องการของคุณ:
- Preferences: แฟล็กที่ไม่เกี่ยวข้องกันจำนวนเล็กน้อย ตั้งค่าได้รวดเร็ว และไม่มีสคีมา
- Proto: โมเดลการตั้งค่าแบบมีโครงสร้าง มีความปลอดภัยด้านชนิดข้อมูล และกำหนดค่าเริ่มต้นได้
ทั้งสองรูปแบบใช้พื้นฐานเดียวกัน ได้แก่ การทำงานแบบอะซิงโครนัส ธุรกรรม และ Flow
ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจของคุณเกี่ยวกับ Proto DataStore
สรุปทบทวน
คุณได้เรียนรู้การจัดเก็บข้อมูลที่มีชนิดด้วย Proto DataStore:
- กำหนดสคีมา โดยมักใช้ Protocol Buffers
- สร้าง
Serializerพร้อมdefaultValue - สร้างที่เก็บผ่านดีลีเกต
dataStore - อ่านฟิลด์ได้โดยตรง และเขียนด้วย
updateData - จัดการข้อมูลเสียหายด้วยตัวจัดการที่ส่งคืนค่าเริ่มต้น
คุณเรียนจบหลักสูตร DataStore แล้ว
คำถามที่พบบ่อย
บทเรียน “Proto DataStore” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Proto DataStore” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Android Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Proto DataStore”
จัดเก็บข้อมูลมีโครงสร้างที่ระบุชนิด คุณปฏิบัติ Android Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Android Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Android Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “Proto DataStore” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Android Academy นี้ได้ไหม
ได้ บทเรียน Android Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ