บทความสอนเขียนแอพ Android บทความนี้ ขอนำเสนอ การทำระบบ Login ด้วย SQLite ซึ่งเป็นความบทที่ 2 ใน 4 เกี่ยวกับการสร้างระบบ Login บน Android สำหรับรายละเอียด บทอื่นๆ ก็มีดังนี้ครับ
ในบทความนี้จะคล้ายๆกับบทความที่แล้ว การทำระบบ Login ด้วย SharedPreferences จะแตกต่างกันที่บทความที่แล้วใช้การเก็บข้อมูลในรูปแบบ SharedPreferences แต่ว่าบทความนี้เปลี่ยนเป็นรูปแบบเก็บข้อมูลลงฐานข้อมูลด้วย SQLite แทน
บทความนี้จะไม่อธิบายพวกพื้นฐานอะไรมากนะครับ หากไม่เข้าใจอะไร ก็สามารถอ่านเพิ่มเติมได้ตามลิงค์นี้
Overview
ภาพรวมของระบบล็อกอินด้วย SQLite จะคล้ายๆกับบทความเก่าเลย แต่จะแตกต่างกันที่ บทความนี้เพิ่มในส่วนของ Change Password เข้าไปด้วย ทำให้เมื่อมองดูการทำงานของแอพแล้ว มันจะไปสัมพันธ์กับฐานข้อมูลเป็นแบบนี้
- การ Login ก็คือการ query
- การ register ก็คืการ insert
- การเปลี่ยนพาสเวิร์ด ก็คือการ update
แบบ Mockup คร่าวๆ ก็จะเป็นแบบนี้
- มีหน้าล็อคอิน สำหรับ ใส่ username, password เพื่อเข้าระบบ
- มีหน้า register สำหรับลงทะเบียน กรณีที่ไม่มี username
- หน้าหลัก หลักจากที่ล็อคอินได้เรียบร้อยแล้ว จะมีปุ่มให้กดเปลี่ยนพาสเวิร์ดด้วย
เริ่มต้นสร้างโปรเจ็ค
บทความนี้จะใช้โปรเจ็คจากบทความที่แล้วเลยนะครับ ฉะนั้น ใช้โค๊ดเดิมได้เลย สามารถโหลดได้จาก Github นี้ครับ
หรือจะ clone ก็ตามนี้
แบบ HTTPS
แบบ SSH
โค๊ดจากบทความที่แล้ว branch คือ part1 นะครับ ถ้า Part2 คือบทความนี้ เอาไว้ดูโค๊ดของ part2 เมื่อจบบทความนี้จะดีกว่านะครับ
เมื่อได้โค๊ดมาแล้ว ก็มาต่อกันเลย
สร้าง UserManagerHelper
ทำการสร้างอินเตอร์เฟซชื่อ UserManagerHelper
ขึ้นมา ดังนี้
จากอินเตอร์เฟซด้านบน ผมได้เขียน Javadoc รายละเอียดไว้ด้านบนแล้ว ซึ่งทั้งสามเมธอด ประกอบไปด้วย
registerUser()
: เอาไว้สำหรับบันทึกข้อมูลลง Database (insert database)
checkUserLogin()
: เอาไว้ query ข้อมูล ว่ามี user นี้หรือไม่ (query database)
changePassword()
: เอาไว้สำหรับเปลี่ยนพาสเวิร์ด (update database)
สร้างคลาส User
สำหรับตัวอย่างนี้ก็ทำการสร้างคลาส model User แบบง่ายๆละกัน คือไม่มีอะไรมาก user แค่มี username และ password เท่านั้น จะได้ดังนี้
แก้ไขคลาส UserManager
ปรับเปลี่ยนคลาส UserManager
ใหม่ โดยลบของเก่าทิ้งให้หมด แล้วแก้ไข ใหม่ เป็นแบบนี้
จากโค๊ดด้านบน ทำการ extends คลาส SQLiteOpenHelper
และ implement อินเตอร์เฟซ UserManagerHelper
ที่ได้สร้างไว้ก่อนหน้านี้ ต่อมาก็ override เมธอด และสร้าง constructor
เพิ่ม global member นี้ลงไป เอาไว้ใช้สำหรับ Debug และ read/write database
ต่อมาที่เมธอด onCreate()
ให้ทำการสร้าง Table ขึ้นมาด้วยคำสั่งนี้
และเมธอด onUpgrade()
จะได้แบบนี้
เมธอด registerUser()
ยังอยู่ที่คลาส UserManagerHelper
เหมือนเดิม ต่อมา ทำการแก้ไขเมธอด registerUser
โดยส่งออปเจ็ค user มา จากนั้นใช้ ContentValues
เพื่อ insert ข้อมูลลงฐานข้อมูล จะได้แบบนี้
เมธอด checkUserLogin()
เมธอดนี้ ก็เช่นเดียวกัน คือรับพารามิเตอร์มาเป็น ออปเจ็ค user จากนั้น เราจะใช้ user นี้แหละ ทำการเช็คโดยการ query ใน database ว่า username และ password ที่เราได้เนี่ย กับในฐานข้อมูล มันตรงกันไหม ถ้ามีข้อมูลแสดงว่าถูกต้อง ก็จะส่งออปเจ็คกลับไป ถ้าไม่ตรง ก็จะส่งค่า null โค๊ดที่ได้ก็ประมาณนี้
เมธอด changePassword()
เมธอดนี้คือทำการเปลี่ยน password ของยูเซอร์นั้นๆ โดยการใช้การ update ฐานข้อมูล โค๊ดก็จะเป็นดังนี้
เรียบร้อย ตอนนี้เราก็สร้างทั้งอินเตอร์เฟซ UserMangerHelper
, คลาส User และคลาส UserManager
ไว้เรียบร้อยแล้ว ต่อไปก็ถึงเวลาเอาเมธอดต่างๆที่สร้างไว้ ไปใช้กันแล้ว
แก้ไขหน้า LoginActivity
เริ่มด้วยการแก้ไขหน้า Login จากทีแรก ใช้การเช็คแบบ SharedPreferences
ด้วยเมธอด checkLoginValidate
เป็นแบบการใช้ SQLite ด้วย UserManager
ที่ได้แก้ไขใหม่แล้ว แบบนี้
โดยเมื่อเช็คแล้ว ว่าล็อคอินได้ถูกต้อง ก็จะทำการส่งค่า username ไปด้วย เพื่อเอาไว้แสดง Hello ที่หน้า main แล้วก็ค่า id กรณีที่เอาไว้เปลี่ยน password
แก้ไขหน้า RegisterActivity
ต่อมาทำการแก้ไขหน้า RegisterActivity นิดหน่อย โดยทำการปรับเปลี่ยนแก้ไข เป็น
โค๊ดออกมาเป็นแบบนี้
MainActivity
สุดท้าย MainActivity เราจะเพิ่มนิดหน่อย จากทีแรก แค่โชว์โลโก้และมี Welcome Text คราวนี้เราจะเพิ่มชื่อล็อคอินของ user และ ปุ่มสำหรับเปลี่ยน พาสเวิร์ดเข้าไปด้วย ฉะนั้น ก็เลยต้องแก้ไขไฟล์ activity_main.xml
และ MainActivity.java
เป็นแบบนี้
ไฟล์ activity_main.xml
ไฟล์ MainActivity.java
จากโค๊ด MainActivity
ด้านบน เริ่มแรก ก็ทำการรับค่า Intent ที่ถูกส่งมาจากหน้า Login คือ username และ id จากนั้นก็เซตค่าให้แสดงว่า “Hi + ชื่อ” ส่วนปุ่ม Change Password ก็ setOnClickListener()
ให้มัน เพื่อเมื่อกดแล้ว ก็จะโชว์ Dialog ขึ้นมาให้กดเปลี่ยนพาสเวิร์ด
โชว์ Dialog changePassword()
เมื่อกดปุ่ม Change Password ก็จะโชว์ Dialog ขึ้นมา ฉะนั้น ก็จะใช้แค่ Dialog แบบ Custom xml ธรรมดา
ให้ทำการสร้างไฟล์ xml เซฟไว้ที่ res/layout/dialog.xml
ไฟล์มีแค่ EditText อันเดียว แบบนี้
ต่อมา ที่เมธอด showDialogPassowrd()
ที่ประกาศโครงเปล่าๆไว้ ก็เพิ่มโค๊ดนี้ลงไป
หากใครทำ Dialog ไม่เป็น สามารถอ่านเพิ่มเติมได้จากบทความนี้ การสร้าง Dialog บน Android
โค๊ดด้านบน เป็นการโชว์ Dialog ธรรมดา เมื่อยูเซอร์เปลี่ยนพาสเวิร์ด ก็จะทำการ update ฐานข้อมูล จากนั้นก็กลับไปหน้าล็อคอินใหม่ อีกครั้ง เป็นอันเรียบร้อย
สรุป
สำหรับตัวอย่างนี้ วิธีการ Login ด้วยการเก็บข้อมูลด้วย SQLite มันจะมีข้อดีกว่า SharedPreferences คือ เราสามารถเพิ่ม User ได้หลายคน สามารถเปลี่ยนแปลงค่าได้ สามารถค้นหาข้อมูลโดยไม่ต้องเปรียบเทียบ Key-Values ตัวอย่างนี้ก็เป็นแบบคร่าวๆนะครับ ใครจะนำไปประยุกต์แก้ไข ดัดแปลงก็ตามสบายเลย อ้อ สำหรับ source code ดูได้จาก Github เลยครับ
หรือใคร clone โปรเจ็คมาแล้ว ก็ดูที่ branch part2 ได้เลยครับ
สำหรับวิธี Login ด้วยการเก็บข้อมูลแบบ SharedPreferences แบบตัวอย่างข้างต้นนั้นมีข้อดีคือ ความสะดวก รวดเร็ว แต่มีข้อเสียคือ เก็บ password เป็น plain text ใน xml ไฟล์ และข้อเสียอีกข้อคือไม่สามารถ ค้นหา username และ password ได้ ทำได้เพียงแค่หาข้อมูลโดยระบุ key เท่านั้น และที่สำคัญ สามารถลงทะเบียนได้แค่ไอดีเดียว เพราะเมื่อมีการลงทะเบียน user ใหม่ มันก็จะไปเซฟทับกับ key ใน SharedPreferences เดิม