Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีใช้ชนิดข้อมูล REAL ใน SQLite บน Android

การใช้ชนิดข้อมูล REAL ใน SQLite บน Android

SQLite เป็นฐานข้อมูล SQL แบบ Open Source ที่จัดเก็บข้อมูลในไฟล์ข้อความบนอุปกรณ์ Android มีการรองรับ SQLite ในตัว (Built-in) โดยไม่ต้องสร้างการเชื่อมต่อแบบ JDBC หรือ ODBC SQLite รองรับคุณสมบัติของ Relational Database ครบถ้วน

ตัวอย่างนี้จะสาธิตวิธีการใช้ชนิดข้อมูล REAL (สำหรับตัวเลขทศนิยม) ใน 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="ป้อนชื่อ"
        android:layout_height="wrap_content" />

    <EditText
        android:id="@+id/salary"
        android:layout_width="match_parent"
        android:inputType="numberDecimal"
        android:hint="ป้อนเงินเดือน"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <Button android:id="@+id/save" android:text="บันทึก" android:layout_width="wrap_content" android:layout_height="wrap_content" />
        <Button android:id="@+id/refresh" android:text="รีเฟรช" android:layout_width="wrap_content" android:layout_height="wrap_content" />
        <Button android:id="@+id/update" android:text="อัปเดต" android:layout_width="wrap_content" android:layout_height="wrap_content" />
        <Button android:id="@+id/delete" android:text="ลบทั้งหมด" 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 2 ช่องสำหรับรับชื่อ (Text) และเงินเดือน (Real/Decimal) ปุ่มบันทึกจะบันทึกข้อมูลเข้า SQLite ปุ่มรีเฟรชจะโหลดข้อมูลใหม่ใน ListView

ขั้นตอนที่ 3: เขียนโค้ด MainActivity.java

package com.example.myapplication;

import android.os.Bundle;
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 androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    private Button btnSave, btnRefresh, btnUpdate, btnDelete;
    private EditText etName, etSalary;
    private ArrayAdapter<String> adapter;
    private ListView listView;
    private DatabaseHelper dbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        dbHelper = new DatabaseHelper(this);
        ArrayList<String> dataList = dbHelper.getAllContacts();

        etName = findViewById(R.id.name);
        etSalary = findViewById(R.id.salary);
        listView = findViewById(R.id.listView);

        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, dataList);
        listView.setAdapter(adapter);

        btnDelete = findViewById(R.id.delete);
        btnDelete.setOnClickListener(v -> {
            if (dbHelper.deleteAll()) {
                Toast.makeText(this, "ลบข้อมูลสำเร็จ", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(this, "ลบข้อมูลไม่สำเร็จ", Toast.LENGTH_LONG).show();
            }
        });

        btnUpdate = findViewById(R.id.update);
        btnUpdate.setOnClickListener(v -> {
            String name = etName.getText().toString().trim();
            String salary = etSalary.getText().toString().trim();
            if (!name.isEmpty() && !salary.isEmpty()) {
                if (dbHelper.update(name, salary)) {
                    Toast.makeText(this, "อัปเดตสำเร็จ", Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(this, "อัปเดตไม่สำเร็จ", Toast.LENGTH_LONG).show();
                }
            } else {
                etName.setError("กรุณาป้อนชื่อ");
                etSalary.setError("กรุณาป้อนเงินเดือน");
            }
        });

        btnRefresh = findViewById(R.id.refresh);
        btnRefresh.setOnClickListener(v -> {
            dataList.clear();
            dataList.addAll(dbHelper.getAllContacts());
            adapter.notifyDataSetChanged();
        });

        btnSave = findViewById(R.id.save);
        btnSave.setOnClickListener(v -> {
            String name = etName.getText().toString().trim();
            String salary = etSalary.getText().toString().trim();
            if (!name.isEmpty() && !salary.isEmpty()) {
                if (dbHelper.insert(name, salary)) {
                    Toast.makeText(this, "บันทึกสำเร็จ", Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(this, "บันทึกไม่สำเร็จ", Toast.LENGTH_LONG).show();
                }
            } else {
                etName.setError("กรุณาป้อนชื่อ");
                etSalary.setError("กรุณาป้อนเงินเดือน");
            }
        });
    }
}

ขั้นตอนที่ 4: สร้างคลาส DatabaseHelper.java

package com.example.myapplication;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import java.util.ArrayList;

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "salaryDatabase";
    private static final String TABLE_NAME = "SalaryDetails";
    private static final int DATABASE_VERSION = 1;

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE " + TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                     "name TEXT, salary REAL, datetime DEFAULT CURRENT_TIMESTAMP)";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }

    public boolean insert(String name, String salary) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("salary", salary); // จะถูกแปลงเป็น REAL อัตโนมัติ
        long result = db.insert(TABLE_NAME, null, values);
        return result != -1;
    }

    public ArrayList<String> getAllContacts() {
        SQLiteDatabase db = this.getReadableDatabase();
        ArrayList<String> list = new ArrayList<>();
        String query = "SELECT id, name, salary, datetime FROM " + TABLE_NAME;
        Cursor cursor = db.rawQuery(query, null);

        if (cursor.moveToFirst()) {
            do {
                String row = cursor.getInt(0) + " : " + cursor.getString(1) + " : " + 
                             cursor.getDouble(2) + " : " + cursor.getString(3);
                list.add(row);
            } while (cursor.moveToNext());
        }
        cursor.close();
        return list;
    }

    public boolean update(String name, String salary) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("salary", salary);
        int rows = db.update(TABLE_NAME, values, "name = ?", new String[]{name});
        return rows > 0;
    }

    public boolean deleteAll() {
        SQLiteDatabase db = this.getWritableDatabase();
        int rows = db.delete(TABLE_NAME, null, null);
        return rows > 0;
    }
}

จุดสำคัญเกี่ยวกับชนิดข้อมูล REAL

  • ชนิด REAL ใน SQLite ใช้เก็บค่าตัวเลขทศนิยม (Floating-point numbers) ขนาด 8 ไบต์
  • เมื่อใช้ ContentValues.put("salary", salary) โดยที่ salary เป็น String ที่เป็นตัวเลขทศนิยม SQLite จะแปลงเป็น REAL อัตโนมัติ
  • เหมาะสำหรับข้อมูลเงินเดือน ราคา อัตราแลกเปลี่ยน หรือค่าที่ต้องการความแม่นยำทศนิยม
  • แตกต่างจาก INTEGER ที่เก็บเฉพาะจำนวนเต็ม และ TEXT ที่เก็บเป็นข้อความ

การทดสอบ

รันแอปพลิเคชันบนอุปกรณ์จริงหรือ Emulator ป้อนชื่อและเงินเดือน (เช่น 25000.50) แล้วกดบันทึก ข้อมูลจะแสดงใน ListView พร้อมกับวันที่/เวลาที่บันทึก