Android SQLite Basics
Android: www.3bugs.com
Android ก SQLite
ฐานขอมูล (database) คอื วิธหี น่งึ ในการจัดเก็บขอมลู ในระบบแอนดรอยด เหมาะสําหรับ
ขอมูลท่ีมีโครงสรางแบบเดียวกันหลายๆชดุ ยกตัวอย)างเช)นขอมูลพนักงาน ซึ่งขอมลู แต)ละชดุ (พนักงาน
แตล) ะคน) ประกอบดวยรหสั พนักงาน ชื่อ นามสกุล และวันเกดิ เป/นตน
รหัสพนักงาน ชือ นามสกลุ วนั เกดิ
6473 สมชาย ไมอ้ ่อน 07/11/1985
6783 สมศกั ดิ รกั งาน 12/07/1979
6777 ยุวดี ศรสี ะอาด 03/01/1976
6789 รงุ่ อรณุ กุลบตุ ร 01/09/1984
แอนดรอยดมาพรอมกับระบบฐานขอมลู SQLite และจัดเตรียม API (Application Program-
ming Interface) ไวใหเราใชทาํ งานกับฐานขอมูล SQLite ไดทันที โดยไมต) องติดตั้งอะไรเพม่ิ เตมิ ซ่งึ
ตัวฐานขอมลู จะถูกเก็บอยู)บนเครอื่ งแอนดรอยดของผูใช หรอื เรียกว)าเป/น local database
ฐานขอ้ มลู ทแ+ี อพของเราสรา้ งขน0ึ จะถูกเกบ็ ไวใ้ น internal directory (ไดเรค็ ทอรสี ว่ นตวั ของแอพ
บน internal storage) ซง+ึ แอพอน+ื ๆไมส่ ามารถเขา้ ถงึ ได้
การใชงานฐานขอมูล SQLite ไม)ตองมีการเซต็ อพั และเตรียมฐานขอมูลไวล)วงหนาตั้งแต)ตอน
พัฒนาแอพ แต)เราจะเขียนโคดใหสรางฐานขอมูลขนึ้ ตอนทแี่ อพทํางานเลย (สรางในชว) ง runtime) ซึ่ง
แอนดรอยดมี "คลาสตวั ชว) ย" (helper class) ไวอํานวยความสะดวกในการสรางฐานขอมูล อพั เกรด
ฐานขอมูล และอ)าน/เขยี นขอมูลในฐานขอมลู
%& (' ) )ก% ก &*% +
SQLite คอื ฐานขอมลู เชิงสมั พนั ธ (relational database) เชน) เดียวกับฐานขอมูลยอดนิยม
อน่ื ๆ ลักษณะสําคัญของฐานขอมูลประเภทนีค้ อื ในฐานขอมูลจะประกอบดวยตารางขอมลู หรือ เทเบิล
(table) ตัง้ แต) 1 เทเบิลขึ้นไป และแต)ละเทเบิลจะประกอบดวยแถว (row) กับคอลัมน (column)
ดงั รูป
Android: www.3bugs.com
( # ) (column) 3 4 5#6 ) (field) 4? ( # )
3 4 4? 5#6 )
EmpID Firstname Lastname Birthdate
6473 07/11/1985 ;< (row) 3 4
6783 กก 12/07/1979 & ( ) (record)
6777 ! 03/01/1976
6789 01/09/1984
" ก#$%
@ A#
&'&$#
เมื่อจะใชงานฐานขอมูลในการเก็บขอมูล อันดับแรกตองออกแบบโครงสร$างของฐานขอมลู ก)อน
วา) จะใหมีเทเบิลอะไรบาง (ในฐานขอมลู หนึ่งสามารถมไี ดมากกวา) 1 เทเบิล) แต)ละเทเบลิ มีคอลัมนอะไร
และเก็บขอมูลชนดิ ใด ซง่ึ โครงสรางของฐานขอมูลนเี้ รียกว)า schema
เม่ือพฒั นาแอพไปเรอื่ ยๆ เราอาจมีความจาํ เปน/ ตองปรับเปลี่ยน schema ของฐานขอมลู เช)น
เพ่มิ เทเบลิ หรือคอลมั นเพือ่ รองรบั ฟWเจอรใหม)ของแอพ หรอื เราอาจจัดระเบยี บขอมูลใหมโ) ดยลบเทเบลิ
หน่งึ และยายขอมลู จากเทเบลิ น้นั ไปเก็บไวในอีกเทเบลิ หนึ่งแทน เปน/ ตน
จากทก่ี ลา) วมาจะเห็นว)า บางคร้ังการพฒั นาแอพเวอรชนั่ ใหม) ไม)เพียงแต)โคดจาวาในแอพจะ
เปล่ยี นไปเทา) นน้ั แต) "ความคาดหวงั " ของโคดจาวาทม่ี ีต)อ schema ของฐานขอมลู ยังเปลี่ยนไปดวย
โดยเวอรช่ัน 1 ของแอพอาจทาํ งานกบั schema ที่เราออกแบบไวเริ่มแรก แตพ) อถึงเวลาท่ีเราปรับปรุง
แอพเปน/ เวอรชัน่ 5 เราอาจตองการ schema ท่ีเปลีย่ นไปก็ได
แอนดรอยดมวี ิธีใหเราอพั เกรดฐานขอมลู ไดอย)างสะดวก โดยผ)านทาง helper class ซึง่ ก็คือ
คลาส SQLiteOpenHelper
Android: www.3bugs.com
จากน้ันเมอื่ นาํ มาระบุในเมธอด rawQuery ก็จะทําใหเคร่ืองหมาย ? ถูกแทนดวยค)าสตรงิ
" " จากอารเรย args และเราจะไดคิวรที สี่ มบูรณ
Hands On: ก% % + & 7 & query ' rawQuery
เราจะอ)านขอมูลทกุ แถวและทกุ คอลัมนจากเทเบิล contacts โดยเพม่ิ การประกาศตัวแปร mDb
อกี ตัวหน่ึงที่ส)วนประกาศของแอคทวิ ติ ี และเพิ่มโคดในเมธอด onCreate ของแอคทวิ ติ ี ดังนี้
public class MainActivity extends AppCompatActivity {
private DatabaseHelper mHelper;
private SQLiteDatabase mDb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHelper = new DatabaseHelper(this);
mDb = mHelper.getWritableDatabase();
String[] allColumns = {
DatabaseHelper.COL_ID,
DatabaseHelper.COL_NAME,
DatabaseHelper.COL_PHONE_NUMBER
};
Cursor cursor = mDb.query(DatabaseHelper.TABLE_NAME, allColumns, null,
null, null, null, null);
}
...
}
ขางบนใชเมธอด query ในการอ)านขอมลู แต)หากเปลีย่ นมาใชเมธอด rawQuery จะเขียนได
ดงั นี้
public class MainActivity extends AppCompatActivity {
private DatabaseHelper mHelper;
private SQLiteDatabase mDb;
Android: www.3bugs.com
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHelper = new DatabaseHelper(this);
mDb = mHelper.getWritableDatabase();
String sqlSelect = "SELECT * FROM " + DatabaseHelper.TABLE_NAME;
Cursor cursor = mDb.rawQuery(sqlSelect, null);
}
...
}
+ กก , < = <
ท้งั เมธอด query และ rawQuery จะส)งคืนเคอรเซอร (ออบเจค็ )Cursor กลบั มาใหเรา
เคอรเซอรน้ันถาอธบิ ายง)ายๆก็คอื ออบเจ็คทเ่ี ก็บผลลพั ธ (result set) ของคิวรีไว ซ่งึ ก็คือแถวและ
คอลมั นทง้ั หมดท่ไี ดจากฐานขอมูลตามคําสงั่ ของคิวรี
1 L &# 111-111-1111
2 "F[\ ) 222-222-2222
&( &) C )
เนือ่ งจาก result set อาจมขี นาดใหญ) ทําใหใชหน)วยความจํามาก ดังนน้ั หลังจากใชงาน
เคอรเซอรแลวจงึ ควรปeดทกุ ครั้งโดยเรียกเมธอด close บนเคอรเซอร
Cursor cursor = mDb.query(DatabaseHelper.TABLE_NAME, allColumns, null, null,
null, null, null);
// ( ) ก * #
cursor.close(); // +, *
Android: www.3bugs.com
❶ ค)าสตรงิ ระบุชอ่ื เทเบิลที่จะแกไขขอมลู
❷ ออบเจ็ค ContenValues ซึ่งระบชุ ื่อและคา) ใหมท) ี่เราตองการกําหนดใหคอลมั น
ต)างๆ (ค)าเดมิ ในคอลมั นจะถูกแทนท่ีดวยค)าจาก ContentValues นี้)
❸ ค)าสตรงิ ระบุเง่อื นไขของแถวที่จะถูกแกไขขอมูล เทียบเทา) ส)วน WHERE ในภาษา SQL
❹ อารเรยของสตริง ซ่ึงค)าสตรงิ แต)ละคา) จะถูกนาํ ไปแทนท่ีเครือ่ งหมาย ? (ถาม)ี ใน
❸ ตามลําดบั
เมอ่ื แทนคา) คงท่ี DatabaseHelper.COL_NAME และแทนค)าสตริงจาก ❹ ลงใน ❸ เราจะได
เงอ่ื นไขของแถวขอมูลทจ่ี ะถูกแกไขเบอรโทรในตวั อย)างนค้ี ือ name=" "
เมธอด delete
ใชลบแถวขอมูลในเทเบิล โดยสามารถระบเุ ง่ือนไขของแถวทีต่ องการลบได เชน) โคดตอ) ไปนี้จะ
ลบแถวทีม่ ีเบอรโทรข้นึ ตนดวย 333
mDb.delete(
DatabaseHelper.TABLE_NAME, ❶
DatabaseHelper.COL_PHONE_NUMBER + " LIKE ?", ❷
new String[] { "333%" } ❸
);
เมธอด delete มพี ารามิเตอร 3 ตัว
❶ คา) สตรงิ ระบุชอื่ เทเบลิ ที่จะลบแถวขอมลู
❷ ค)าสตริงระบุเง่ือนไขของแถวทจ่ี ะถูกลบ เทียบเท)าสว) น WHERE ในภาษา SQL,
ถาหากระบุ null จะลบทกุ แถวในเทเบิล
❸ อารเรยของสตริง ซง่ึ ค)าสตรงิ แต)ละคา) จะถูกนาํ ไปแทนทเ่ี คร่อื งหมาย ? (ถามี) ใน
❷ ตามลําดบั
เมื่อแทนคา) คงท่ี DatabaseHelper.COL_PHONE_NUMBER และแทนค)าสตริงจาก ❸ ลงใน ❷
เราจะไดเงื่อนไขของแถวขอมลู ที่จะถกู ลบในตวั อย)างนคี้ ือ phone_number LIKE "333%" โดย
เครื่องหมาย % ในภาษา SQL หมายถงึ ตัวอักษรใดๆกี่ตวั กไ็ ด
Android: www.3bugs.com