บทนำเกี่ยวกับ SQLite ใน Android
ก่อนจะเข้าสู่ตัวอย่าง เราควรเข้าใจว่า SQLite ใน Android คืออะไร SQLite เป็นฐานข้อมูล SQL แบบโอเพนซอร์สที่จัดเก็บข้อมูลในไฟล์ข้อความบนอุปกรณ์ Android มาพร้อมกับการใช้งาน SQLite แบบบิล्टอิน (built-in) รองรับคุณสมบัติของฐานข้อมูลเชิงสัมพันธ์ทั้งหมด สำหรับการเข้าถึงฐานข้อมูลนี้ คุณไม่จำเป็นต้องสร้างการเชื่อมต่อแบบ JDBC หรือ ODBC เหมือนฐานข้อมูลทั่วไป
ตัวอย่าง: การใช้ cast() ใน Android SQLite
ตัวอย่างนี้สาธิตวิธีใช้ฟังก์ชัน cast() เพื่อแปลงชนิดข้อมูลใน SQLite บน Android
ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่ใน Android Studio
ไปที่ File → New Project แล้วกรอกรายละเอียดที่จำเป็นเพื่อสร้างโปรเจกต์ใหม่
ขั้นตอนที่ 2: เพิ่มโค้ดใน res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<EditText
android:id="@+id/name"
android:layout_width="match_parent"
android:hint="Enter Name"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/salary"
android:layout_width="match_parent"
android:inputType="numberDecimal"
android:hint="Enter Salary"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/save"
android:text="Save"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/refresh"
android:text="Refresh"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/udate"
android:text="Update"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/Delete"
android:text="DeleteALL"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
ในโค้ดข้างต้น เราใช้ EditText สำหรับชื่อและเงินเดือน เมื่อผู้ใช้กดปุ่ม Save จะบันทึกข้อมูลลง SQLite กดปุ่ม Refresh เพื่อแสดงข้อมูลใน ListView
ขั้นตอนที่ 3: เพิ่มโค้ดใน src/MainActivity.java
package com.example.andy.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
Button save, refresh;
EditText name, salary;
ArrayAdapter arrayAdapter;
private ListView listView;
@Override
protected void onCreate(Bundle readdInstanceState) {
super.onCreate(readdInstanceState);
setContentView(R.layout.activity_main);
final DatabaseHelper helper = new DatabaseHelper(this);
final ArrayList array_list = helper.getAllCotacts();
name = findViewById(R.id.name);
salary = findViewById(R.id.salary);
listView = findViewById(R.id.listView);
arrayAdapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, array_list);
listView.setAdapter(arrayAdapter);
findViewById(R.id.Delete).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (helper.delete()) {
Toast.makeText(MainActivity.this, "Deleted", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this, "NOT Deleted", Toast.LENGTH_LONG).show();
}
}
});
findViewById(R.id.udate).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!name.getText().toString().isEmpty() && !salary.getText().toString().isEmpty()) {
if (helper.update(name.getText().toString(), salary.getText().toString())) {
Toast.makeText(MainActivity.this, "Updated", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this, "NOT Updated", Toast.LENGTH_LONG).show();
}
} else {
name.setError("Enter NAME");
salary.setError("Enter Salary");
}
}
});
findViewById(R.id.refresh).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
array_list.clear();
array_list.addAll(helper.getAllCotacts());
arrayAdapter.notifyDataSetChanged();
listView.invalidateViews();
listView.refreshDrawableState();
}
});
findViewById(R.id.save).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!name.getText().toString().isEmpty() && !salary.getText().toString().isEmpty()) {
if (helper.insert(name.getText().toString(), salary.getText().toString())) {
Toast.makeText(MainActivity.this, "Inserted", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this, "NOT Inserted", Toast.LENGTH_LONG).show();
}
} else {
name.setError("Enter NAME");
salary.setError("Enter Salary");
}
}
});
}
}
ขั้นตอนที่ 4: เพิ่มโค้ดใน src/DatabaseHelper.java
package com.example.andy.myapplication;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import java.io.IOException;
import java.util.ArrayList;
class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "salaryDatabase6";
public static final String CONTACTS_TABLE_NAME = "SalaryDetails";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL(
"create table " + CONTACTS_TABLE_NAME + "(id INTEGER PRIMARY KEY, name text, salary float, datetime default current_timestamp)"
);
} catch (SQLiteException e) {
try {
throw new IOException(e);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + CONTACTS_TABLE_NAME);
onCreate(db);
}
public boolean insert(String s, String s1) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("name", s);
contentValues.put("salary", s1);
db.replace(CONTACTS_TABLE_NAME, null, contentValues);
return true;
}
public ArrayList getAllCotacts() {
SQLiteDatabase db = this.getReadableDatabase();
ArrayList<String> array_list = new ArrayList<String>();
Cursor res = db.rawQuery("select (id ||' : '||name || ' : ' || cast(salary as int) || ' : '|| strftime('%d-%m-%Y %H:%M:%S', datetime)) as fullname from " + CONTACTS_TABLE_NAME, null);
res.moveToFirst();
while (res.isAfterLast() == false) {
if ((res != null) && (res.getCount() > 0))
array_list.add(res.getString(res.getColumnIndex("fullname")));
res.moveToNext();
}
return array_list;
}
public boolean update(String s, String s1) {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("UPDATE " + CONTACTS_TABLE_NAME + " SET name = " + "'" + s + "', " + "salary = " + "'" + s1 + "'");
return true;
}
public boolean delete() {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("DELETE from " + CONTACTS_TABLE_NAME);
return true;
}
}
การทดสอบแอปพลิเคชัน
ลองรันแอปพลิเคชัน สมมติว่าคุณเชื่อมต่ออุปกรณ์ Android จริงกับคอมพิวเตอร์แล้ว จาก Android Studio เปิดไฟล์ Activity แล้วคลิกไอคอน Run จากแถบเครื่องมือ เลือกอุปกรณ์มือถือของคุณ แล้วตรวจสอบหน้าจอเริ่มต้น

ในผลลัพธ์ข้างต้น จะเห็นว่าค่าเงินเดือนถูกเก็บเป็น float ตอนนี้ลองกดปุ่ม Refresh เพื่อดูทุกรекอร์ด ในผลลัพธ์นี้ จะแปลง float เป็น integer ตามภาพด้านล่าง

สรุป
ฟังก์ชัน cast() ใน SQLite ใช้สำหรับแปลงชนิดข้อมูลจากชนิดหนึ่งไปอีกชนิดหนึ่ง ในตัวอย่างนี้ เราแปลงค่า salary จาก float เป็น integer โดยใช้ cast(salary as int) ในคำสั่ง SQL ซึ่งเป็นเทคนิคที่มีประโยชน์เมื่อต้องการแสดงผลหรือคำนวณข้อมูลในรูปแบบที่ต้องการ