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.

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.