22 January 2013

SQLite in Android - ฐานข้อมูล SQLite ถ้าเข้าใจก็ไม่ใช่เรื่องยาก

Updated on

        บทความรอบนี้เจ้าของบล็อกขอพูดถึงเรื่องฐานข้อมูลหน่อยละกัน  เพราะถึงแม้ว่าการใช้ 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+