สวัสดีครับกลับมาเจอกันอีกครั้ง วันนี้เราจะมาลองเล่นเกี่ยวกับการทำ Database SQLite ใน Android กัน ซึ่งปกติการสร้าง Database ในแอพจะเป็นอะไรที่ยุ่งยางพอสมควร ต้องทำผ่าน SQL Command แต่วันนี้เรามีวิธีที่จะสร้าง Database เป็นไฟล์เอาไว้ก่อน แล้วค่อยเอาไป Import ใส่แอพทีหลังทำให้ขั้นตอนการสร้างสะดวกสบายขึ้นพอสมควร
แต่ก่อนอื่นเลย ก่อนที่เราจะวิ่งเราต้องเดินให้เป็นก่อนครับ ขออัญเชิญบทความเรื่อง Database ใน Android ของท่าน SleepingForless ไปอ่านก่อน เพื่อทำความเข้าใจให้ตรงกันว่า Database ใน Android ทำงานอย่างไร เป็นการปูพื้นเบื้องต้น
[Android Code] ฐานข้อมูล SQLite ถ้าเข้าใจก็ไม่ใช่เรื่องยาก
[Android Code] การ Query ในฐานข้อมูล SQLite
[Android Code] การใช้ Cursor กับฐานข้อมูล SQLite
[Android Code] ตัวอย่างการจัดการข้อมูลในฐานข้อมูลเบื้องต้น [ดู เพิ่ม แก้ไข ลบ]
หลังจากอ่านเรื่อง Database ใน Android กันมาจนอิ่มแล้วเรามาเริ่มกันเลยดีกว่า วันนี้เราจะสร้าง Database ซึ่งประกอบด้วย 1 Table ที่เก็บชื่อสถานที่(Point of Interest)กับพิกัด Lat Long แล้วเอาไปแสดงบน ListView แบบง่ายๆ
Step1
โหลด DB Browser for SQLite มาใช้ครับ ตัวนี้เป็นโปรแกรมสำหรับ create edit delete โดยผ่าน GUI สามารถใช้ได้ทั้ง Windows และ Mac เลยครับ โหลดมาลงแล้วก็ลองสร้าง Database กันเลย
Step2
พอเลือกที่เซฟเสร็จจะมี Dialog ขึ้นมาให้สร้าง Table ผมขอสร้างเป็น POI_TABLE เอาไว้เก็บชื่อสถานที่กับพิกัด Latitude Longitude
Step3
เพิ่มข้อมูลใน Table กันตามสะดวกเลยนะครับจากนั้นก็กด Write Changes ให้มัน Save ด้วย เดี๋ยวจะหาว่าหล่อไม่เตือน
Step4
สร้าง Project เปล่าๆขึ้นมาครับ จากนั้นเพิ่ม dependency นี่เข้าไปใน Project ครับ
Library นี้จะช่วยจัดการกับ Database ที่จะ Import เข้ามาจากไฟล์ใน Assets ทั้งการสร้างและการ Upgrade
[/xml]
Step5
ถ้าใครยังไม่มี Folder assets ใน Project ก็สร้างเลยนะครับ ถ้าใครมีอยู่แล้วก็นำไฟล์ Database ที่เราสร้างมาจาก Step3 นำมาวางไว้ใน Folder assets/databases
Step6
สร้าง Class DatabaseOpenHelper ขึ้นมาครับ โดยภายในจะมีรูปร่างหน้าตาแบบนี้ โดย DATABASE_NAME ให้ใส่ชื่อไฟล์ Database ของเราพร้อมนามสกุลไฟล์เข้าไปครับ แล้วให้ Version เป็น 1 Class นี้จะทำหน้าที่ในการสร้าง Database จากไฟล์ SQLite ที่เราวางไว้ใน assets/databases รวมถึงการ Upgrade ก็อยู่ตรงนี้ด้วย (วิธี Upgrade ดูได้จาก Github ของ Library แต่ผมก็ยังไม่เคยลองเช่นกัน)
[java]
public class DatabaseOpenHelper extends SQLiteAssetHelper {
private static final String DATABASE_NAME = "location.sqlite";
private static final int DATABASE_VERSION = 1;
public DatabaseOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
}
[/java]
Step7
สร้าง Class DatabaseAccess เป็นแบบ Singleton เพื่อที่เวลาเราจะใช้งาน Database ให้มาเข้าใช้งานผ่าน Class นี้ครับ
[java]
public class DatabaseAccess {
private SQLiteOpenHelper openHelper;
private SQLiteDatabase database;
private static DatabaseAccess instance;
private DatabaseAccess(Context context) {
this.openHelper = new DatabaseOpenHelper(context);
}
public static DatabaseAccess getInstance(Context context) {
if (instance == null) {
instance = new DatabaseAccess(context);
}
return instance;
}
public void open() {
this.database = openHelper.getWritableDatabase();
}
public void close() {
if (database != null) {
this.database.close();
}
}
public List<String> getPOIs() {
List<String> list = new ArrayList<>();
Cursor cursor = database.rawQuery("SELECT * FROM POI_TABLE", null);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
list.add(cursor.getString(1) + "\n" +
cursor.getDouble(2) + " " +
cursor.getDouble(3));
cursor.moveToNext();
}
cursor.close();
return list;
}
}
[/java]
ภายในจะมี Open Close ตามปกติ แล้วเราก็เพิ่มฟังก์ชั่น getPOIs เข้าไปเพื่อดึงข้อมูลจาก table POI_TABLE แล้วส่งออกไปให้ Class ที่จะใช้ครับ โดยจะส่ง List ของ String ออกไป (สำหรับใครอยากได้ Query ที่มากกว่านี้ต้องลองไปศึกษา SQL Command จาก w3schools.com กันต่อเอาเองนะครับ ถ้าจะเอาไปใช้งานจริงๆ ควรสร้าง Model มาเก็บค่าจะสะดวกกว่ามาก)
Step8
สร้าง Layout ที่เราจะเอาข้อมูลมาแสดงครับ ผมใส่ ListView เข้าไปตัวนึง อย่าลืมใส่ ID ให้กับ ListView นะครับ
[xml]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
[/xml]
Step9 Step10 ListView listView; @Override DatabaseAccess databaseAccess = DatabaseAccess.getInstance(MainActivity.this); ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, pois); ส่วนใครอยากสร้างมากกว่านี้ลองปรับเปลี่ยนแก้ไขกันดูนะครับ โดยรวมแล้วจะช่วยประหยัดเวลาไปได้ส่วนนึง ไม่ต้องมานั่งใส่ SQL Command เองทั้งหมด จากตัวอย่างเราสามารถนำไปเล่นกับ Google Map กันได้ตามสะดวกแต่ไปศึกษากันเองนะครับ มีคนสอนไว้เยอะแล้ว ถ้าอยากได้ข้อมูลเพิ่มเติมเกี่ยวกับ Database ลองศึกษาจาก Link ด้านล่างนี้ได้เลยครับ วันนี้ผมขอตัวไปก่อนนะครับ Link Reference
ผมขอใช้ MainActivity เลยนะครับ เพิ่มตัว ListView เข้าไป findViewById กันตามสะดวกจากนั้นก็เรียก Class DatabaseAccess เพื่อทำการเรียกใช้งาน โดยใส่ Context เข้าไปเป็น Parameter จากนั้นทำการ Open เพื่อเชื่อมต่อ Database ก่อนแล้วก็สร้าง List
[java]
DatabaseAccess databaseAccess = DatabaseAccess.getInstance(MainActivity.this);
databaseAccess.open();
List<String> pois = databaseAccess.getPOIs();
databaseAccess.close();
[/java]
นำ List
[java]
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listview);
databaseAccess.open();
List<String> pois = databaseAccess.getPOIs();
databaseAccess.close();
listView.setAdapter(adapter);
}
}
[/java]
https://github.com/jgilfelt/android-sqlite-asset-helper
http://www.javahelps.com/2015/04/import-and-use-external-database-in.html
http://www.javahelps.com/2015/03/advanced-android-database.html
http://sqlitebrowser.org/