บทความรอบนี้เจ้าของบล็อกขอพูดถึงเรื่องฐานข้อมูลหน่อยละกัน เพราะถึงแม้ว่าการใช้ SQLite จะมีตัวอย่างกันให้หลากหลาย แต่ถึงกระนั้นก็ไม่ค่อยจะมีเนื้อหาสำหรับผู้ที่พึ่งเริ่มต้นมากนัก
สำหรับ SQLite เจ้าของบล็อกจะใช้เป็นคำสั่ง SQL โดยตรงนะ เพราะว่าเจ้าของบล็อกชอบใช้เป็นคำสั่ง SQL มากกว่า และคนที่เคยทำ PHP + SQL มาก่อน สามารถเข้าใจง่ายด้วย สำหรับผู้ที่หลงเข้ามาอ่านถ้าเห็นว่าคำสั่งเจ้าของบล็อก ไม่เหมือนกับในเว็ปอื่นๆ ก็เพราะว่าใช้คนละวิธีกันนะ
ทีนี้ก็ขอพูดถึงเรื่องฐานข้อมูลโดยคร่าวๆต่อเลยละกันนะ สำหรับฐานข้อมูลจะเป็นการเก็บข้อมูลไว้ในรูปของตาราง โดยที่แต่ละแถวในแนวตั้งจะเรียกกันว่า คอลัมน์ (Column)
แต่ละแถวในแนวนอนจะเรียกว่า แถว (Row) หรือ ฟิลด์ (Field) แต่เจ้าของบล็อกชอบติดเรียกว่า แถว ซะมากกว่า
ส่วนการระบุข้อมูลก็จะระบุจากคอลัมน์และแถวนั่นแหละ สมมติเลือกคอลัมน์ที่ 2 และแถวที่ 3 ข้อมูลที่ได้ก็คือ Data 10
การสร้างตาราง (Create)
ทีนี้ก็มาดูการสร้างตารางในฐานข้อมูลกันก่อนเลยดีกว่า ก่อนอื่นมาดูคำสั่งสร้างฐานข้อมูลใน SQL ธรรมดากันก่อน
CREATE TABLE table_name (_id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT, password TEXT, level INTEGER);
สำหรับคำอธิบายในแต่ละคำสั่งก็ดูรูปข้างล่างนี้ได้เลย (กดเพื่อขยายได้)
ตารางที่ได้ก็จะเป็นเช่นนี้เลย
สำหรับคอลัมน์จะไม่มีตายตัว จะสร้างกี่คอลัมน์ก็ได้ ไม่ต้องกลัวเต็มตั้งชื่อคอมลัมน์ว่าอะไรก็ตามแต่ แต่พยายามให้จำง่ายใช้ง่าย แต่คอมลัมน์แรกให้สร้าง Primary Key ชื่อ _id เป็น Integer และกำหนดให้เป็น Auto Increment ด้วยทุกครั้ง
ส่วนการใช้คำสั่งสร้างตารางในแอนดรอยด์ก็จะใช้คำสั่งดังนี้
db.execSQL("CREATE TABLE table_name "
+ "(_id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ "username TEXT, password TEXT, "
+ "level INTEGER);");
โดยจะเห็นว่าเวลาใช้คำสั่ง execSQL จะต้องมีฟันหนู " ครอบคำสั่ง SQL ซึ่งอันนี้เจ้าของบล็อกแนะนำให้ ฝึกดูการเชื่อมคำของ String เพราะต้องใช้ อย่างเช่นโค๊ดข้างบนนี้เจ้าของบล็อกแยกเป็นสี่บรรทัด โดยใช้ + เชื่อมเอา ซึ่งจริงๆจะพิมยาวๆเลยก็ได้เช่นกัน แต่ก็ตัดขึ้นบรรทัดใหม่เพื่อให้ดูง่ายแทน
แต่ในการใช้งานจริงๆ ไม่แนะนำให้พิมชื่อลงไปตรงๆอย่าง table_name แนะนำให้สร้างตัวแปร String มาเก็บไว้แล้วเรียกใช้ผ่านตัวแปรแทน
String TABLE_NAME = "table_name";
String COL_USERNAME = "username";
String COL_PASSWORD = "password";
String COL_LEVEL = "level";
db.execSQL("CREATE TABLE table_name "
+ "(_id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_USERNAME + " TEXT, " + COL_PASSWORD + " TEXT, "
+ COL_LEVEL + " INTEGER);");
ซึ่งวิธีนี้เวลาแก้ไขชื่อคอลัมน์หรือตารางก็เพียงแค่แก้ในตัวแปร ไม่ต้องนั่งไล่แก้ทุกบรรทัดในเวลาที่สร้างข้อมูลเป็นจำนวนเยอะๆ
Tip : จะมีหลายๆคนที่พิม SQL ผิด เช่นลืมฟันหนูบ้าง ลืมเว้นวรรคบ้าง เวลาโปรแกรมทำงานก็จะจะเกิด Error ได้ แล้วไม่รู้ว่าผิดที่ตรงไหน ดังนั้นสำหรับผู้ที่ยังไม่ชำนาญก็ให้สร้างคำสั่งไว้ในตัวแปร String ก่อน แล้วลองใช้คำสั่ง Log เพื่อแสดงออกมาใน LogCat เพื่อให้เช็คได้ง่าย
String TABLE_NAME = "table_name";
String COL_USERNAME = "username";
String COL_PASSWORD = "password";
String COL_LEVEL = "level";
String sql = "CREATE TABLE table_name "
+ "(_id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_USERNAME + " TEXT, " + COL_PASSWORD + " TEXT, "
+ COL_LEVEL + " INTEGER);";
Log.i("Execute SQL", sql);
db.execSQL(sql);
การเพิ่มข้อมูล (Insert)
ต่อมาก็เป็นการเพิ่มข้อมูลลงในตารางของฐานข้อมูล โดยจะใช้ตารางเดิมที่ใช้เป็นตัวอย่างต่อเลยละกัน สำหรับการเพิ่มข้อมูลลงในตารางก็จะใช้คำสั่ง Insert
INSERT INTO table_name (username, password, level)
VALUES ('akexorcist', '123456789', 50);
โดยจะเห็นว่าเฉพาะคอลัมน์ที่เก็บข้อมูลเป็น Text จะมี ' (Single Quotation) ครอบข้อมูลนั้นๆด้วย ส่วนแบบอื่นๆอย่างเช่น Integer จะไม่ต้องใส่ เวลาใช้คำสั่งในแอนดรอยด์ก็จะเป็นดังนี้
db.execSQL("INSERT INTO table_name (username, password, level) VALUES ('akexorcist', '123456789', 50);");
อย่าลืมว่าชื่อตารางและคอลัมน์เก็บไว้ในตัวแปร Stringดังนั้นคำสั่งก็จะแก้ไขเล็กน้อยตามนี้เลย
db.execSQL("INSERT INTO " + TABLE_NAME + " (" + COL_USERNAME
+ ", " + COL_PASSWORD + ", " + COL_LEVEL
+ ") VALUES ('akexorcist', '123456789', 50);");
ข้อมูลที่เพิ่มลงในฐานข้อมูลก็จะได้ตามนี้เลย
จะเห็นว่าคอลัมน์ _id เจ้าของบล็อกไม่ได้ใส่ข้อมูลซักหน่อยทำไมมี 1 ใส่เข้ามา ทั้งนี้ก็เพราะว่าเจ้าของบล็อกกำหนดตอนสร้างตารางไว้แล้วว่า Auto Increment ดังนั้นคอลัมน์นี้จะเพิ่มข้อมูลให้เองเลย โดยเริ่มตั้งแต่ 1, 2, 3, ...... , X
การแก้ไขข้อมูล (Update)
ต่อมาก็เป็นการแก้ไขข้อมูลหรืออัพเดทข้อมูลกันบ้าง เอาไว้เวลาที่ต้องการแก้ไขข้อมูลเก่า โดยจะใช้คำสั่ง Update ส่วนข้อมูลก็จะอ้างอิงต่อจากภาพข้างบนนี้เลยละกัน
UPDATE table_name
SET username='android', password='jellybean', level=99
WHERE username='sleeping' AND password='forless' AND level=19;
คำสั่งมันยาวขึ้นเรื่อยๆล่ะ เลยขอแบ่งบรรทัดหน่อยละกัน
จะเห็นว่ามีการกำหนดข้อมูลลงในแต่ละคอลัมน์ด้วยว่าจะให้เปลี่ยนเป็นอะไร และใช้ Where ค้นหาว่าจะให้เปลี่ยนข้อมูลในแถวไหนของตาราง จากตัวอย่างก็คือระบุมาเลยว่าเปลี่ยน username จาก sleeping เป็น android และ password จาก forless เป็น jellybean และเปลี่ยน level จาก 19 เป็น 99
สำหรับต่อท้าย SET จะสามารถแก้ไขเฉพาะคอลัมน์ที่ต้องการได้เช่นกัน
UPDATE table_name SET password='jellybean'
WHERE username='sleeping' AND password='forless' AND level=19;
คำสั่งอันนี้ก็จะค้นหาคอลัมน์ username เป็น sleeping คอลัมน์ password เป็น forless และคอลัมน์ level เป็น 19 แต่จะเปลี่ยนแค่คอลัมน์ password เป็น jellybean อย่างเดียว
หรือจะค้นหาแค่บางคอลัมน์เพื่อเปลี่ยนข้อมูลก็ได้เช่นกัน
UPDATE table_name SET password='jellybean'
WHERE username='sleeping' AND password='forless';
เจ้าของบล็อกไม่แนะนำให้ใช้ Where ค้นหาแค่คอลัมน์เดียว เพราะบางทีอาจจะมีข้อมูลที่ซ้ำกันอยู่ในตารางเดียวกัน อาจจะทำให้ข้อมูลที่คอลัมน์นั้นๆซ้ำกัน ถูกเปลี่ยนไปทั้งคู่
ลองดูจากตัวอย่างในตารางข้างบนล่าสุดเลย จะเห็นว่ามีคอลัมน์ level ที่มีข้อมูลซ้ำกันคือ 19
UPDATE table_name SET password='jellybean' WHERE level=19;
คำสั่งข้างต้นนี้จะทำให้แถวที่คอลัมน์ level เท่ากับ 19 ถูกเปลี่ยนคอลัมน์ password เป็น jellybean ทั้งหมด ผลก็คือ
จะเห็นว่าแถวของคอลัมน์ _id ที่เป็น 1 และ 4 ถูกเปลี่ยน password เหมือนกัน เพราะว่าเจ้าของบล็อกใช คำสั่งค้นหาคอลัมน์แค่ว่า คอลัมน์ level ที่เท่ากับ 19 ทำให้มีสองคอลัมน์ที่มีคอลัมน์ level เป็น 19 ถูกเปลี่ยนข้อมูลทั้งคู่
ดังนั้นการจะใช้ Where ควรคำนึงถึงจุดนี้ด้วย เพราะจะทำให้เกิดการผิดพลาดได้ ควรใช้กับข้อมูลที่ไม่สามารถเปลี่ยนแปลงได้หรือเปลี่ยนแปลงได้ยาก เช่น
UPDATE table_name SET password='jellybean'
WHERE username='sleeping' AND password='forless';
จากคำสั่งดังกล่าวจะทำให้สามารถเจาะจงเฉพาะข้อมูลได้แม่นขึ้น ป้องกันการเกิดความผิดพลาดของข้อมูลที่ซ้ำซ้อนกันได้ดี
และถ้าต้องการค้นหาด้วยเงื่อนไขมากกว่าหนึ่งอย่างก็ใช้ไม่ยาก เหมือนการกำหนดเงื่อนไขใน If เลย ใช้ AND และ OR เป็นตัวเชื่อม
UPDATE table_name SET level=61
WHERE username='untitled' OR password='1150';
db.execSQL("UPDATE table_name SET level=61 WHERE username='untitled' OR password='1150';");
กรณีเรียกชื่อตารางและคอลัมน์ผ่านตัวแปร ก็จะเป็นแบบนี้แทน
db.execSQL("UPDATE " + TABLE_NAME + " SET " + COL_LEVEL + "=61"
+ " WHERE " + COL_USERNAME + "='untitled' OR "
+ COL_PASSWORD + "='1150';");
การลบข้อมูล (Delete)
ต่อมาก็เป็นเรื่องสุดท้ายเลยกับการลบข้อมูลออก สำหรับการลบข้อมูลออกก็ใช้แค่คำสั่ง Delete
DELETE FROM table_name WHERE username='blogger';
สำหรับคำสั่งของ Delete ก็ไม่มีอะไรมาก เลือกตารางแล้วเลือกข้อมูลที่จะลบเลย จะค้นหาหลายๆข้อมูลโดยใช้ AND หรือ OR ช่วย แบบ Update ก็ได้เช่นกัน
และถ้าใช้กับแอนดรอยด์ก็เหมือนเดิมเลย ไม่ได้เปลี่ยนแปลงอะไร
db.execSQL("DELETE FROM table_name WHERE username='blogger';");
กรณีเรียกชื่อตารางและคอลัมน์ผ่านตัวแปร ก็จะเป็นแบบนี้แทน
db.execSQL("DELETE FROM " + TABLE_NAME
+ " WHERE " + COL_USERNAME + "='blogger';");
บทความนี้ไม่มีไฟล์ตัวอย่างให้นะ เพราะว่าเป็นแค่ทฤษฎีให้อ่านทำความเข้าใจ ถ้ายังไม่เข้าใจก็ให้กลับไปอ่านใหม่ตั้งแต่ต้นละกันนะ 55555+