Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Hướng dẫn sử dụng kiểu dữ liệu BLOB trong SQLite trên Android

Giới thiệu về SQLite trên Android

SQLite là một cơ sở dữ liệu SQL mã nguồn mở, lưu trữ dữ liệu trong file văn bản trên thiết bị. Android tích hợp sẵn SQLite, hỗ trợ đầy đủ các tính năng của cơ sở dữ liệu quan hệ. Không cần thiết lập kết nối như JDBC hay ODBC để truy cập database.

Ví dụ: Lưu trữ dữ liệu BLOB (Binary Large Object)

Trong ví dụ này, chúng ta sẽ lưu tên (text) và lương (BLOB) vào SQLite, sau đó hiển thị trên ListView.

Bước 1: Tạo project mới

Mở Android Studio → File → New Project → Điền thông tin cần thiết.

Bước 2: Thiết kế giao diện (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="Nhập tên"
        android:layout_height="wrap_content" />

    <EditText
        android:id="@+id/salary"
        android:layout_width="match_parent"
        android:inputType="numberDecimal"
        android:hint="Nhập lương"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <Button android:id="@+id/save" android:text="Lưu" android:layout_width="wrap_content" android:layout_height="wrap_content" />
        <Button android:id="@+id/refresh" android:text="Làm mới" android:layout_width="wrap_content" android:layout_height="wrap_content" />
        <Button android:id="@+id/update" android:text="Cập nhật" android:layout_width="wrap_content" android:layout_height="wrap_content" />
        <Button android:id="@+id/delete" android:text="Xóa tất cả" 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>

Giao diện gồm 2 EditText (tên, lương), 4 nút bấm (Lưu, Làm mới, Cập nhật, Xóa tất cả) và ListView hiển thị dữ liệu.

Bước 3: Code MainActivity.java

package com.example.blobdemo;

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 EditText name, salary;
    private ListView listView;
    private ArrayAdapter<String> arrayAdapter;
    private ArrayList<String> dataList;
    private DatabaseHelper dbHelper;

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

        dbHelper = new DatabaseHelper(this);
        dataList = new ArrayList<>(dbHelper.getAllContacts());
        
        name = findViewById(R.id.name);
        salary = findViewById(R.id.salary);
        listView = findViewById(R.id.listView);
        
        arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, dataList);
        listView.setAdapter(arrayAdapter);

        findViewById(R.id.save).setOnClickListener(v -> insertData());
        findViewById(R.id.refresh).setOnClickListener(v -> refreshList());
        findViewById(R.id.update).setOnClickListener(v -> updateData());
        findViewById(R.id.delete).setOnClickListener(v -> deleteAll());
    }

    private void insertData() {
        String n = name.getText().toString().trim();
        String s = salary.getText().toString().trim();
        if (n.isEmpty() || s.isEmpty()) {
            showError();
            return;
        }
        if (dbHelper.insert(n, s)) {
            Toast.makeText(this, "Đã thêm", Toast.LENGTH_SHORT).show();
            refreshList();
        } else {
            Toast.makeText(this, "Thêm thất bại", Toast.LENGTH_SHORT).show();
        }
    }

    private void updateData() {
        String n = name.getText().toString().trim();
        String s = salary.getText().toString().trim();
        if (n.isEmpty() || s.isEmpty()) {
            showError();
            return;
        }
        if (dbHelper.update(n, s)) {
            Toast.makeText(this, "Đã cập nhật", Toast.LENGTH_SHORT).show();
            refreshList();
        } else {
            Toast.makeText(this, "Cập nhật thất bại", Toast.LENGTH_SHORT).show();
        }
    }

    private void deleteAll() {
        if (dbHelper.deleteAll()) {
            Toast.makeText(this, "Đã xóa tất cả", Toast.LENGTH_SHORT).show();
            refreshList();
        } else {
            Toast.makeText(this, "Xóa thất bại", Toast.LENGTH_SHORT).show();
        }
    }

    private void refreshList() {
        dataList.clear();
        dataList.addAll(dbHelper.getAllContacts());
        arrayAdapter.notifyDataSetChanged();
    }

    private void showError() {
        if (name.getText().toString().trim().isEmpty()) name.setError("Nhập tên");
        if (salary.getText().toString().trim().isEmpty()) salary.setError("Nhập lương");
    }
}

Bước 4: Tạo DatabaseHelper.java

package com.example.blobdemo;

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

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

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE " + TABLE_NAME + 
            "(id INTEGER PRIMARY KEY AUTOINCREMENT, " +
            "name TEXT, " +
            "salary BLOB, " +
            "created_at TIMESTAMP 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 = getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("salary", salary.getBytes()); // Chuyển string thành byte[] cho BLOB
        long result = db.insert(TABLE_NAME, null, values);
        return result != -1;
    }

    public ArrayList<String> getAllContacts() {
        ArrayList<String> list = new ArrayList<>();
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.rawQuery(
            "SELECT id, name, salary, created_at FROM " + TABLE_NAME, null);
        
        if (cursor.moveToFirst()) {
            do {
                int id = cursor.getInt(0);
                String name = cursor.getString(1);
                byte[] salaryBytes = cursor.getBlob(2);
                String salary = new String(salaryBytes); // Chuyển byte[] về string
                String time = cursor.getString(3);
                list.add(id + " : " + name + " : " + salary + " : " + time);
            } while (cursor.moveToNext());
        }
        cursor.close();
        return list;
    }

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

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

Chạy ứng dụng

Kết nối thiết bị Android thật hoặc dùng emulator. Nhấn Run trong Android Studio. Giao diện sẽ hiển thị như hình minh họa.

Hướng dẫn sử dụng kiểu dữ liệu BLOB trong SQLite trên Android

Kết quả: Dữ liệu tên lưu dạng text, lương lưu dạng BLOB (byte array). Khi truy xuất, chuyển byte[] về string để hiển thị.

Lưu ý quan trọng

  • Kiểu BLOB phù hợp để lưu hình ảnh, file nhị phân, dữ liệu mã hóa.
  • Trong ví dụ này minh họa cơ bản bằng cách chuyển String ↔ byte[].
  • Nên dùng ContentValues.put("column", byte[]) cho BLOB thay vì put string trực tiếp.
  • Sử dụng cursor.getBlob(index) để đọc dữ liệu BLOB.