SharedPreferences
จัดเก็บข้อมูลแบบคีย์-ค่าอย่างง่ายให้คงอยู่ระหว่างเซสชันของแอปด้วย SharedPreferences เรียนรู้การบันทึก อ่าน และลบค่ากำหนด
SharedPreferences เป็นบทเรียน Android Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 6 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Android Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Android Academy มีบทเรียนทั้งหมด 6 บทเรียน
ตัวเลือกพื้นที่จัดเก็บข้อมูลถาวร
Android มีหลายวิธีสำหรับจัดเก็บข้อมูลไว้ในเครื่อง:
- SharedPreferences — คู่คีย์กับค่าแบบง่าย (การตั้งค่า โทเค็น)
- Room — ฐานข้อมูล SQLite แบบมีโครงสร้าง (ข้อมูลซับซ้อน)
- DataStore — สิ่งทดแทน SharedPreferences แบบอะซิงโครนัสสมัยใหม่
- ไฟล์ — การรับส่งข้อมูลกับไฟล์โดยตรง
SharedPreferences เหมาะอย่างยิ่งสำหรับการตั้งค่าและค่ากำหนดของผู้ใช้แบบง่าย
SharedPreferences คืออะไร
SharedPreferences จัดเก็บข้อมูลเป็น คู่คีย์กับค่า ในไฟล์ XML บนอุปกรณ์ รองรับ:
- String
- Int / Long / Float
- Boolean
- Set<String>
ข้อมูลยังคงอยู่เมื่อเปิดแอปใหม่ และยังคงอยู่หลังการเปลี่ยนแปลงการกำหนดค่า (การหมุนหน้าจอ)
การรับอินสแตนซ์ SharedPreferences
มีสองวิธีในการรับออบเจ็กต์ SharedPreferences:
// 1. Named preferences (shared across activities)
val prefs = getSharedPreferences(
"MyAppPrefs", // file name
Context.MODE_PRIVATE // only your app can read it
)
// 2. Activity's default preferences
val prefs = getPreferences(Context.MODE_PRIVATE)การเขียนข้อมูล
ใช้ ตัวแก้ไข เพื่อเขียนค่า จากนั้นเรียก apply():
val prefs = getSharedPreferences("MyAppPrefs", Context.MODE_PRIVATE)
prefs.edit()
.putString("username", "alice")
.putInt("login_count", 5)
.putBoolean("dark_mode", true)
.apply() // async, non-blocking — preferred over commit()
// Kotlin extension (cleaner syntax):
with(prefs.edit()) {
putString("username", "alice")
apply()
}การอ่านข้อมูล
อ่านค่าด้วยคีย์ พร้อมระบุค่าเริ่มต้นหากไม่มีคีย์นั้น:
val prefs = getSharedPreferences("MyAppPrefs", Context.MODE_PRIVATE)
val username = prefs.getString("username", "Guest") // default: "Guest"
val count = prefs.getInt("login_count", 0) // default: 0
val darkMode = prefs.getBoolean("dark_mode", false) // default: false
println("Hello, $username! Logins: $count. Dark: $darkMode")ตัวอย่างการใช้งานจริง: สลับธีม
บันทึกและกู้คืนการตั้งค่าโหมดมืด:
class SettingsActivity : AppCompatActivity() {
private lateinit var binding: ActivitySettingsBinding
private lateinit var prefs: SharedPreferences
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivitySettingsBinding.inflate(layoutInflater)
setContentView(binding.root)
prefs = getSharedPreferences("settings", MODE_PRIVATE)
// Restore saved state
binding.switchDarkMode.isChecked = prefs.getBoolean("dark_mode", false)
binding.switchDarkMode.setOnCheckedChangeListener { _, isChecked ->
prefs.edit().putBoolean("dark_mode", isChecked).apply()
}
}
}การบันทึกโทเค็นเข้าสู่ระบบ
จัดเก็บและตรวจสอบโทเค็นการยืนยันตัวตนเมื่อเปิดแอปใหม่:
// Save token after login
fun saveToken(token: String) {
getSharedPreferences("auth", MODE_PRIVATE)
.edit()
.putString("token", token)
.apply()
}
// Check if user is logged in
fun isLoggedIn(): Boolean {
val token = getSharedPreferences("auth", MODE_PRIVATE)
.getString("token", null)
return token != null
}
// Clear on logout
fun logout() {
getSharedPreferences("auth", MODE_PRIVATE)
.edit()
.remove("token")
.apply()
}การนำออกและล้างข้อมูล
นำคีย์บางรายการออกหรือล้างข้อมูลทั้งหมด:
.remove("key")— ลบรายการหนึ่งรายการ.clear()— ลบทุกอย่างในไฟล์
เรียก .apply() เสมอ (หรือ .commit() หากต้องการยืนยันแบบทำงานพร้อมกัน)
SharedPreferences เทียบกับ DataStore
SharedPreferences ใช้งานได้ดี แต่มีข้อจำกัด:
- การอ่านแบบทำงานพร้อมกันอาจบล็อกเธรดหลัก
- ไม่มีความปลอดภัยด้านชนิดข้อมูล
Jetpack DataStore เป็นสิ่งทดแทนสมัยใหม่ — ทำงานแบบอะซิงโครนัสอย่างสมบูรณ์ด้วย Kotlin Flow และมีความปลอดภัยด้านชนิดข้อมูล สำหรับโปรเจกต์ใหม่ ควรเลือกใช้ DataStore ส่วน SharedPreferences ยังคงถูกใช้อย่างแพร่หลายและเหมาะสมสำหรับข้อมูลปริมาณเล็กน้อย
ตรวจสอบความเข้าใจ
เมธอดใดใช้บันทึกข้อมูลลง SharedPreferences แบบอะซิงโครนัสโดยไม่บล็อกเธรด UI
สรุป: SharedPreferences
ขณะนี้คุณสามารถเก็บข้อมูลแบบง่ายให้คงอยู่ระหว่างการเปิดแอปแต่ละครั้งได้:
- รับข้อมูลด้วย
getSharedPreferences(name, MODE_PRIVATE) - เขียน:
.edit().putString(key, value).apply() - อ่าน:
.getString(key, defaultValue) - นำออก:
.edit().remove(key).apply() - ใช้
apply()(อะซิงโครนัส) แทนcommit()(ทำงานพร้อมกัน)
หลักสูตรถัดไป: สถาปัตยกรรมแอป — ViewModel, Room และ Coroutines
คำถามที่พบบ่อย
บทเรียน “SharedPreferences” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “SharedPreferences” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Android Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Android Academy มีบทเรียนทั้งหมด 6 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “SharedPreferences”
จัดเก็บข้อมูลแบบคีย์-ค่าอย่างง่ายให้คงอยู่ระหว่างเซสชันของแอปด้วย SharedPreferences เรียนรู้การบันทึก อ่าน และลบค่ากำหนด คุณปฏิบัติ Android Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Android Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Android Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 6 บทเรียน
บทเรียน “SharedPreferences” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Android Academy นี้ได้ไหม
ได้ บทเรียน Android Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คอลเลกชัน Kotlin
- พื้นฐาน RecyclerView
- เหตุการณ์คลิกใน RecyclerView
- SharedPreferences
- ค่ากำหนดของ DataStore
- อะแดปเตอร์และ DiffUtil