ตัวอย่างการใช้งาน SQLite บน Android ตอนที่ 1
![ตัวอย่างการใช้งาน SQLite บน Android ตอนที่ 1](/_vercel/image?url=%2Fimages%2F2014%2F06%2Fandroid-studio-cover.png&w=828&q=80)
วันนี้จะมาพูดถึงเรื่องของ Android SQLite กันนะครับ ตัวแอพพลิเคชันที่ทำเป็น Demo ก็เสร็จนานแล้ว เหลือแต่ช่วงเขียนบทความนี่แหละ ยังหาเวลาเขียนลงตัวไม่ได้ซักที จะว่าไปเรื่องนี้น่าจะเป็นเรื่อง Classic และเป็นเรื่องที่จำเป็นที่นักพัฒนาแอพพลิเคชันแอนดรอยส์ทุกคนจำเป็นต้องรู้ครับ เพราะมันคือการติดต่อฐานข้อมูล เชื่อมต่อฐานข้อมูลกับแอพพลิเคชันของเรา นั่นเอง
SQLite คืออะไร?
SQLite มันก็คือ Library ตัวนึงที่มีขนาดเล็กมาก คอยจัดการ Database ให้กับเรา โดยใช้ Syntax SQL เหมือนกับ MySQL เลย Data Type ที่ SQLite ซับพอร์ตก็คือ TEXT
เหมือนกับ String ใน Java, INTEGER
เก็บค่าตัวเลขเหมือนกับ long
และ REAL
เก็บค่าเหมือนกับ double
สำหรับใน SQLite ใน Android นั้นมันติดมากับเครื่อง Android ทุกเครื่อง เวลาเขียนแอพเพื่อเชื่อมต่อกับ SQLite ก็ไม่จำเป็นต้องโหลดหรือทำอะไรเพิ่ม เพราะว่าทาง Android นั้นก็ได้เตรียม Class ต่างๆ อำนวยความสะดวกให้เราแล้ว
สำหรับที่อยู่ เวลาเก็บ Database จะถูกเก็บไว้ที่ data/data/PACKAGE_NAME/databases/DB_NAME
Step 1 : Create Project
ไม่พูดมาก เรามาเริ่มสร้างโปรเจ็คกันเลยดีกว่าครับ สำหรับโปรเจ็คนี้เป้าหมายคือ การใช้งาน SQLite และสามารถ CREATE, UPDATE, DELETE ฐานข้อมูลได้ ส่วนตัวแอพพลิเคชันจะประกอบไปด้วย
- หน้า MainActivity สำหรับแสดง List รายชื่อเพื่อนต่างๆของเรา
- หน้า AddFriendActivity สำหรับหน้ากรอกข้อมูล เพื่อเพิ่มเพื่อนเข้าสู่ฐานข้อมูล
- หน้า DetailActivity สำหรับไว้ดูรายละเอียดของเพื่อนคนนั้นๆ
เมื่อวาดออกมาเป็น Diagram ก็จะได้หน้าตาประมาณนี้
ผมไม่พูดถึงวิธีการสร้างโปรเจ็คนะครับ สมมติว่าทุกคนสร้างโปรเจ็คเสร็จแล้ว ต่อมา ดูโครงสร้างของ Database ที่เราจะสร้างกัน เนื่องจากแอพพลิเคชันนี้เป็นแอพสำหรับดูรายละเอียดของเพื่อน ฉะนั้นโครงสร้างของ ฐานข้อมูล ก็จะเป็นลักษณะนี้
ต่อมาก็สร้างคลาส Model ตั้งชื่อว่า Friend.java
ทำการสร้าง Constructor และ Getter, Setter แบบนี้
1package com.devahoy.sample.ahoysqlite.model;2
3public class Friend {4
5 private int id;6 private String firstName;7 private String lastName;8 private String tel;9 private String email;10 private String description;11
12 //Default Constructor13 public Friend() {14
15 }16 //Constructor17 public Friend(int id, String firstName, String lastName, String tel,18 String email, String description) {19
20 this.id = id;21 this.firstName = firstName;22 this.lastName = lastName;23 this.tel = tel;24 this.email = email;25 this.description = description;26
27 }28
29 //Getter, Setter30
31}
Constructor ก็เอาไว้สำหรับ Init ค่า Friend ครับ เวลาสร้างออปเจ็ค Friend ขึ้นมา เช่น id, ชื่อ, นามสกุล, เบอร์โทร, อีเมล์และรายละเอียดต่างๆ
ต่อมา เราก็จะทำการสร้างคลาส เพื่อไว้จัดการ Database ของเรา ผมสร้างคลาสชื่อว่า DBHelper
และทำการ extends คลาส SQLiteOpenHelper
เจ้าคลาสที่เราทำการ extends นี้มันจะเป็นคลาสที่เอาไว้ช่วยให้เราสร้างฐานข้อมูล , อัพเดทฐานข้อมูลครับ ทำการ implements เมธอด และสร้าง Constructor ดังนี้
1package com.devahoy.sample.ahoysqlite.utils;2
3import android.content.Context;4import android.database.sqlite.SQLiteDatabase;5import android.database.sqlite.SQLiteOpenHelper;6
7public class DBHelper extends SQLiteOpenHelper {8
9 public DBHelper(Context context) {10 super(context, "devahoy_friends.db", null, 1);11 }12 @Override13 public void onCreate(SQLiteDatabase db) {14
15 }16
17 @Override18 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {19
20 }21}
จากด้านบน Constructor จะทำการเรียก super จากนั้นส่ง arguments เป็น Context
, ชื่อฐานข้อมูล, CursorFactory, และ เวอร์ชันของ Database ตามลำดับ ส่วนเมธอด onCreate()
และ onUpgrade()
จะเอาไว้สร้างฐานข้อมูลของเรา และอัพเกรดฐานข้อมูลครับ
1@Override2public void onCreate(SQLiteDatabase db) {3
4 String CREATE_FRIEND_TABLE = "CREATE TABLE friend ( id INTEGER PRIMARY KEY AUTOINCREMENT, " +5 "first_name TEXT, last_name TEXT, tel TEXT, email TEXT, description TEXT)";6
7 db.execSQL(CREATE_FRIEND_TABLE);8}9
10@Override11public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {12
13 String DROP_FRIEND_TABLE = "DROP TABLE IF EXISTS friend";14
15 db.execSQL(DROP_FRIEND_TABLE);16
17 onCreate(db);18}
เมธอด onCreate()
ผมก็ทำการสร้าง SQL Command จากนั้นก็สั่ง db.execSQL(String)
เพื่อทำการสร้าง Table จาก String และเมธอด onUpgrade()
สำหรับเมื่อมีการเปลี่ยนโครงสร้าง Database หรือมีการเปลี่ยนเวอร์ชัน ก็จะทำการ Drop Table และเรียกเมธอด onCreate(db)
เพื่อสร้างใหม่
จะเห็นได้ว่า ที่ onCreate()
ผมสั่ง SQL Command เป็น String แบบ hard code เลย ดูแล้วไม่สะดวก หากต้องการแก้ไข หรือเปลี่ยนแปลง Field ต่างๆ ผมก็เลยประกาศเป็นตัวแปรแทน โดยไปเพิ่มตัวแปรที่ model Friend เป็นแบบนี้
1public class Friend {2 //Database3 public static final String DATABASE_NAME = "devahoy_friends.db";4 public static final int DATABASE_VERSION = 1;5 public static final String TABLE = "friend";6
7 public class Column {8 public static final String ID = BaseColumns._ID;9 public static final String FIRST_NAME = "first_name";10 public static final String LAST_NAME = "last_name";11 public static final String TEL = "tel";12 public static final String EMAIL = "email";13 public static final String DESCRIPTION = "description";14 }15 ...16}
เพื่ออะไร? เพื่อสร้างเป็นค่าคงที่สำหรับเก็บชื่อฐานข้อมูล เก็บชื่อ table และก็เก็บค่า column ในฐานข้อมูล กลับมาที่ไฟล์ DBHelper
คราวนี้จากใช้ SQL แบบ hard code ก็เปลี่ยนมาใช้ String.format
แบบนี้
1String CREATE_FRIEND_TABLE = String.format("CREATE TABLE %s " +2 "(%s INTEGER PRIMARY KEY AUTOINCREMENT, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT)",3 Friend.TABLE,4 Friend.Column.ID,5 Friend.Column.FIRST_NAME,6 Friend.Column.LAST_NAME,7 Friend.Column.TEL,8 Friend.Column.EMAIL,9 Friend.Column.DESCRIPTION);
เครื่องหมาย %s ตัวแรก ก็คือ Friend.TABLE, %s ตัวสองคือ Friend.Column.ID ไล่ไปเรื่อยๆ
สุดท้ายไฟล์ DBHelper
ก็จะได้แบบนี้
1package com.devahoy.sample.ahoysqlite.utils;2
3import android.content.Context;4import android.database.sqlite.SQLiteDatabase;5import android.database.sqlite.SQLiteOpenHelper;6import android.util.Log;7
8
9public class DBHelper extends SQLiteOpenHelper {10
11 private final String TAG = getClass().getSimpleName();12
13 private SQLiteDatabase sqLiteDatabase;14
15 public DBHelper(Context context) {16 super(context, Friend.DATABASE_NAME, null, Friend.DATABASE_VERSION);17 }18
19 @Override20 public void onCreate(SQLiteDatabase db) {21
22 String CREATE_FRIEND_TABLE = String.format("CREATE TABLE %s " +23 "(%s INTEGER PRIMARY KEY AUTOINCREMENT, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT)",24 Friend.TABLE,25 Friend.Column.ID,26 Friend.Column.FIRST_NAME,27 Friend.Column.LAST_NAME,28 Friend.Column.TEL,29 Friend.Column.EMAIL,30 Friend.Column.DESCRIPTION);31
32 Log.i(TAG, CREATE_FRIEND_TABLE);33
34 // create friend table35 db.execSQL(CREATE_FRIEND_TABLE);36 }37
38 @Override39 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {40
41 String DROP_FRIEND_TABLE = "DROP TABLE IF EXISTS " + Friend.TABLE;42
43 db.execSQL(DROP_FRIEND_TABLE);44
45 Log.i(TAG, "Upgrade Database from " + oldVersion + " to " + newVersion);46
47 onCreate(db);48 }
ทีนี้เมื่อเราสร้าง DBHelper
เสร็จแล้ว ต่อไปเราจะใช้มันยังไง?
Step 2 : สร้าง ListView
ต่อมาก็จะทำการสร้าง Layout สำหรับแสดงรายชื่อเพื่อนนะครับ แต่ว่าผมจะใช้การ extends ListActivity
ฉะนั้นก็เลยไม่จำเป็นต้องสร้างไฟล์เลเอาท์ ก็ข้ามไปสร้าง MainActivity.java
เลย หรือจะใช้คลาสเดิมก็ได้ ทำการ extends ListActivity
ครับ เพื่อจะแสดง ListView เฉยๆ ตัวคลาสจะได้ดังนี้
1package com.devahoy.sample.ahoysqlite;2
3import android.app.ListActivity;4import android.content.Intent;5import android.os.Bundle;6import android.view.Menu;7import android.view.MenuItem;8import android.view.View;9import android.widget.ArrayAdapter;10import android.widget.ListView;11
12import com.devahoy.sample.ahoysqlite.model.Friend;13import com.devahoy.sample.ahoysqlite.utils.DBHelper;14
15import java.util.List;16
17
18public class MainActivity extends ListActivity {19
20 DBHelper mHelper;21 List<String> friends;22
23 @Override24 protected void onCreate(Bundle savedInstanceState) {25 super.onCreate(savedInstanceState);26
27 String[] lists = {""};28
29 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,30 android.R.layout.simple_list_item_1, lists);31 setListAdapter(adapter);32 }33}
จะเห็นได้ว่าโครงสร้างของคลาส ไม่มีอะไรมาก ก็คือจะทำการสร้าง ListView ด้วย ArrayAdapter
จากรายชื่อเพื่อนในฐานข้อมูล แต่ว่าตอนนี้ยังไม่ได้ Query อะไร ก็จะใส่เป็น lists แบบไม่มีอะไรไปก่อน android.R.layout.simple_list_item_1
นั้นเป็น Layout ของทาง Android นะครับ
สำหรับใครไม่รู้เรื่อง ListActivity สามารถอ่านเพิ่มได้ที่บทความนี้ครับ การสร้าง ListView แบบง่ายๆ
Step 3: Query SQLite
มาถึงการ Query ฐานข้อมูลกันบ้าง กลับมาที่คลาส DBHelper
ต่อครับ ผมจะทำการสร้างเมธอดขึ้นมาใหม่ เพื่อทำการ Query จากนั้นก็จะส่งข้อมูลกลับไปเป็น List<String>
เพื่อเอาไปแสดงใน ListView
หน้า MainActivity
ก็เลยทำการตั้งชื่อเมธอดว่า getFriendList()
1public List<String> getFriendList() {2 List<String> friends = new ArrayList<String>();3
4 sqLiteDatabase = this.getWritableDatabase();5
6 Cursor cursor = sqLiteDatabase.query7 (Friend.TABLE, null, null, null, null, null, null);8
9 if (cursor != null) {10 cursor.moveToFirst();11 }12
13 while(!cursor.isAfterLast()) {14
15 friends.add(cursor.getLong(0) + " " +16 cursor.getString(1) + " " +17 cursor.getString(2));18
19 cursor.moveToNext();20 }21
22 sqLiteDatabase.close();23
24 return friends;25}
จะเห็นได้ว่า ผมเริ่มทำการสร้าง SQL Statement เพื่อจะ Query จากฐานข้อมูล เริ่มแรกให้ this.getWriteableDatabase()
เพื่อให้เข้าถึงการอ่านฐานข้อมูลนั่นเอง จากนั้นก็ทำการ Query ด้วยคำสั่ง query
โดยส่งพารามิเตอร์เป็น ชื่อ Table ส่วนอันอื่นเป็น null คือ Query ข้อมูลจาก Table ชื่อ Friend ทั้งหมด มีค่าเท่ากับ SELECT * FROM friend
จากนั้นก็วนลูป ส่งค่า List<String>
กลับไปนั่นเอง
Note: สำหรับ
cursor.getXXXX(int)
คือการ get ค่าด้วย Type ที่กำหนด ใน Column ตำแหน่งต่างๆ เช่นcursor.getLong(0)
ก็จะทำการ get ค่า id,getString(1)
ก็จะทำการ get ค่า first_name ออกมา และgetString(2)
ก็จะทำการ get ค่า last_name ออกมาตามลำดับ
เท่านี้ในส่วนของการ Query รายชื่อเพื่อน ก็เรียบร้อย ต่อไปก็กลับไปที่คลาส MainActivity
Step 4: โชว์รายชื่อเพื่อน
เมื่อเราทำการสร้างเมธอดใน DBHelper
เสร็จแล้ว ต่อไปเราก็จะเรียกใช้มันที่ MainActivity
กันครับ
1public class MainActivity extends ListActivity {2
3 DBHelper mHelper;4 List<String> friends;5
6 @Override7 protected void onCreate(Bundle savedInstanceState) {8 super.onCreate(savedInstanceState);9
10 mHelper = new DBHelper(this);11 friends = mHelper.getFriendList();12
13 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,14 android.R.layout.simple_list_item_1, friends);15
16 setListAdapter(adapter);17 }18}
ที่เมธอด onCreate()
ทำการสร้าง new instance ของ DBHelper จากนั้นก็เรียกเมธอด getFriendList()
เพื่อส่งค่ากลับมาที่ตัวแปร friends
ทดสอบรันโปรแกรมครับ จะเห็นความว่างเปล่า ไม่มีอะไร ฮ่าๆ :D
ตอนนี้เรายังไม่รู้จักวิธีการ INSERT, UPDATE, DELETE ฉะนั้นก็ใช้วิธี เอา db ที่ผมสร้างไว้ devahoy_friends.db เอาไปใช้ก่อน โดยเปิด DDMS จากนั้นเลือกไปที่ data/data/com.devahoy.sample.ahoysqlite/databases
แล้วก็กด Push a File into Device นำไฟล์ devahoy_friends.db
ไปใส่ จากนั้นทดสอบ รันแอพพลิเคชันครับ จะเห็นรายชื่อเพื่อนขึ้นมาแล้ว
ส่วนการ INSERT, UPDATE, DELETE ต่อ Part 2 ที่นี่ครับ สำหรับบทความนี้ขอจบเท่านี้ก่อน
- Authors
-
Chai Phonbopit
เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust