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

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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