Giới thiệu về SQLite trong Android
SQLite là một cơ sở dữ liệu SQL mã nguồn mở, lưu trữ dữ liệu vào một file văn bản trên thiết bị. Android tích hợp sẵn triển khai SQLite, hỗ trợ đầy đủ các tính năng của cơ sở dữ liệu quan hệ. Để truy cập cơ sở dữ liệu này, bạn không cần thiết lập kết nối như JDBC, ODBC hay các middleware khác.
Mục tiêu
Hướng dẫn cách truy vấn dữ liệu từ đầu tuần hiện tại (Chủ nhật) dựa trên cột timestamp trong SQLite Android.
Các bước thực hiện
Bước 1: Tạo dự án mới
Mở Android Studio, chọn File → New Project, điền thông tin cần thiết để tạo dự án.
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 bao gồm hai ô nhập liệu (Tên, Lương), bốn nút thao tác và một ListView hiển thị dữ liệu. Khi nhấn "Làm mới", danh sách sẽ tải dữ liệu trong tuần hiện tại.
Bước 3: Code MainActivity (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;
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final DatabaseHelper helper = new DatabaseHelper(this);
final ArrayList array_list = helper.getAllContacts();
name = findViewById(R.id.name);
salary = findViewById(R.id.salary);
listView = findViewById(R.id.listView);
final ArrayAdapter arrayAdapter = new ArrayAdapter<>(this,
android.R.layout.simple_list_item_1, array_list);
listView.setAdapter(arrayAdapter);
findViewById(R.id.delete).setOnClickListener(v -> {
if (helper.delete()) {
Toast.makeText(MainActivity.this, "Đã xóa", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this, "Xóa thất bại", Toast.LENGTH_LONG).show();
}
});
findViewById(R.id.update).setOnClickListener(v -> {
if (!name.getText().toString().isEmpty() && !salary.getText().toString().isEmpty()) {
if (helper.update(name.getText().toString(), salary.getText().toString())) {
Toast.makeText(MainActivity.this, "Đã cập nhật", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this, "Cập nhật thất bại", Toast.LENGTH_LONG).show();
}
} else {
name.setError("Nhập tên");
salary.setError("Nhập lương");
}
});
findViewById(R.id.refresh).setOnClickListener(v -> {
array_list.clear();
array_list.addAll(helper.getAllContacts());
arrayAdapter.notifyDataSetChanged();
listView.invalidateViews();
listView.refreshDrawableState();
});
findViewById(R.id.save).setOnClickListener(v -> {
if (!name.getText().toString().isEmpty() && !salary.getText().toString().isEmpty()) {
if (helper.insert(name.getText().toString(), salary.getText().toString())) {
Toast.makeText(MainActivity.this, "Đã thêm", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this, "Thêm thất bại", Toast.LENGTH_LONG).show();
}
} else {
name.setError("Nhập tên");
salary.setError("Nhập lương");
}
});
}
}
Bước 4: Code DatabaseHelper (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 = "salaryDatabase5";
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 TEXT, 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 name, String salary) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("name", name);
cv.put("salary", salary);
db.replace(CONTACTS_TABLE_NAME, null, cv);
return true;
}
public ArrayList getAllContacts() {
SQLiteDatabase db = this.getReadableDatabase();
ArrayList array_list = new ArrayList<>();
// Truy vấn quan trọng: lấy dữ liệu từ đầu tuần hiện tại (Chủ nhật)
Cursor res = db.rawQuery(
"SELECT (id || ' : ' || name || ' : ' || salary || ' : ' || datetime) AS fullname " +
"FROM " + CONTACTS_TABLE_NAME +
" WHERE datetime >= DATE('now', 'weekday 0', '-7 days')", null);
res.moveToFirst();
while (!res.isAfterLast()) {
array_list.add(res.getString(res.getColumnIndex("fullname")));
res.moveToNext();
}
return array_list;
}
public boolean update(String name, String salary) {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("UPDATE " + CONTACTS_TABLE_NAME +
" SET name = '" + name + "', salary = '" + salary + "'");
return true;
}
public boolean delete() {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("DELETE FROM " + CONTACTS_TABLE_NAME);
return true;
}
}
Giải thích truy vấn SQL chính
Câu lệnh DATE('now', 'weekday 0', '-7 days') trả về ngày Chủ nhật đầu tuần hiện tại:
'now': thời điểm hiện tại.'weekday 0': tiến tới Chủ nhật tiếp theo (0 = Chủ nhật).'-7 days': lùi lại 7 ngày → chính là Chủ nhật của tuần hiện tại.
Điều kiện WHERE datetime >= ... sẽ lọc các bản ghi từ đầu tuần đến nay.
Chạy ứng dụng
Kết nối thiết bị thật, nhấn Run trong Android Studio. Màn hình sẽ hiển thị danh sách các bản ghi trong tuần hiện tại.

Trong ví dụ, cơ sở dữ liệu chỉ có dữ liệu của 2 ngày nên ListView chỉ hiển thị 2 bản ghi.