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

Cách lấy thời điểm đầu tuần (ngày đầu tiên) từ timestamp trong Android SQLite

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.

Cách lấy thời điểm đầu tuần (ngày đầu tiên) từ timestamp trong Android SQLite

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.