SQLite Trong Android (Phần 2)

SQLite Trong Android

Phần 2: Thao tác Sửa, Xóa và Tìm Kiếm trong SQLite

1. Giới thiệu.

Xin chào các bạn!! Ở phần 1 mình đã giới thiệu cho các bạn biết thế nào là SQLite trong Android, đồng thời mình cũng đã hướng dẫn các bạn cách Cấu hìnhInsert một dòng mới vào bảng đã tạo trong SQLite rồi đúng không!. Hôm nay, mình sẽ tiếp tục hướng dẫn các bạn về những thao tác Sửa, XóaTìm kiếm trên một bảng trong SQLite nhé!.

Về project thì chúng ta vẫn sử dụng Project cũ của phần 1, nhưng file activity_main.xml chúng ta sẽ thêm 3 Button để thực hiện chức năng Sửa, Xóa và Tìm kiếm, cụ thể chúng ta sửa lại như sau:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.windows10timt.demosqlite.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Tên sinh viên"
            android:textSize="20sp" />

        <EditText
            android:id="@+id/edtTenSV"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Nhập tên sinh viên muốn thêm..."
            android:lines="1" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <Button
                android:id="@+id/btnThem"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Thêm" />

            <Button
                android:id="@+id/btnSua"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Sửa" />

            <Button
                android:id="@+id/btnXoa"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Xóa" />

            <Button
                android:id="@+id/btnTimkiem"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Tìm Kiếm" />
        </LinearLayout>

        <ListView
            android:id="@+id/lvDanhsach"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

</RelativeLayout>

Trong MainActivity chúng ta khai báo và ánh xạ 3 Button này:

Button btnThem, btnSua, btnXoa, btnTimKiem;
EditText edtTenSV;
ListView lvDanhsach;

DataSqlite data;

ArrayList<ObjectSinhvien> arrayData;

int position;

Ở đây mình có khai báo thêm một biến position, biến này có công dụng là để lưu lại vị trí của dòng mình muốn sửa hay xóa, các btnSua, btnXoa, btnTimKiem các bạn Ánh xạ như bình thường nhé.

2. Thao tác Sửa trong SQLite.

Đầu tiên, để Sửa được một dòng trong SQLite, các bạn phải bắt sự kiện OnItemClickListener() của lvDanhsach, sự kiện này có tác dụng là khi Click vào 1 dòng trong ListView, nó sẽ hiển thị giá trị của dòng đó lên EditText Tên Sinh Viên để chúng ta sửa. Sự kiện OnItemClickListener() của chúng ta sẽ như sau:

lvDanhsach.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                edtTenSV.setText(arrayData.get(i).tenSV);
                position = i;
            }
        });

Ở đây, i chính là vị trí item mà chúng ta Click vào trên ListView, chúng ta sẽ lưu vị trí này lại để sử dụng cho các tác vụ SửaXóa.

Bây giờ, khi đã có vị trí cần SửaTên sinh viên cần sửa rồi, chúng ta sẽ bắt sự kiện Click của btnSua:

btnSua.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!edtTenSV.getText().toString().trim().equals("")) {
                    data.TruyVanKhongTraVe("Update QuanLySinhVien set TenSV='" + edtTenSV.getText().toString().trim() + "' where ID=" + arrayData.get(position).maSV + "");
                    Toast.makeText(MainActivity.this, "Sửa thành công sinh viên" + edtTenSV.getText(), Toast.LENGTH_SHORT).show();
                    LoadData();
                } else {
                    Toast.makeText(MainActivity.this, "Hãy chọn sinh viên cần sửa!!", Toast.LENGTH_SHORT).show();
                }
            }
        });

Mình sẽ giải thích một chút về code nhé!! Ở đây mình sẽ gọi hàm TruyVanKhongTraVe() của Class DataSlite vì câu lệnh mình muốn thao tác ở Nhóm 1 (các bạn có thể xem lại ở Phần 1, mục 1). Để sửa một dòng trong SQLite, các bạn sử dụng câu lệnh Update, trong hàm này các bạn truyền vào Tên bảng muốn sửa, Nội dung của cột muốn sửa, các bạn có thể sửa nhiều cột, mỗi cột sẽ phân cách nhau bằng dấu phẩy, và cuối cùng là một Điều kiện, điều kiện của mình là ID của Sinh viên cần sửa, ở đây mình sẽ lấy ra ID dựa vào position đã lưu lúc nãy.

Lưu ý quan trọng, các bạn phải có điều kiện nhé, nếu KHÔNG có điều kiện, tất cả các dòng trong bảng của bạn sẽ cùng cập nhật, lúc này tất cả Tên sinh viên sẽ giống nhau hết đấy!!!.

3. Thao tác Xóa trong SQLite.

Để Xóa một dòng trong SQLite các bạn bắt sự kiện Click cho btnXoa như sau:

 btnXoa.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!edtTenSV.getText().toString().trim().equals("")) {
                    data.TruyVanKhongTraVe("Delete from QuanLySinhVien where ID=" + arrayData.get(position).maSV + "");
                    Toast.makeText(MainActivity.this, "Xóa thành công sinh viên " + edtTenSV.getText(), Toast.LENGTH_SHORT).show();
                    edtTenSV.setText("");
                    LoadData();
                } else {
                    Toast.makeText(MainActivity.this, "Hãy chọn sinh viên muốn xóa!!", Toast.LENGTH_SHORT).show();
                }
            }
        });

Trong sự kiện này, các bạn gọi hàm TruyVanKhongTraVe() của Class DataSqlite vì câu lệnh mình muốn thao tác ở Nhóm 1 (Các bạn có thể xem lại ở Phần 1, Mục 1). Để Xóa một dòng trong bảng, chúng ta dùng câu lệnh Delete và truyền vào 2 thứ đó là Tên bảng có dòng cần xóa cùng với Điều kiện cần xóa, các bạn có thể xóa theo bất cứ điều kiện nào mà mình thích ví dụ Tên sinh viên, Tuổi, Địa chỉ,… nhưng thường người ta chỉ xóa theo Mã số mà thôi.

Lưu ý đặc biệt, cũng giống như sửa, khi xóa các bạn phải truyền vào một điều kiện, nếu KHÔNG có điều kiện, toàn bộ dữ liệu trong bảng của các bạn sẽ bị xóa hết đấy!!.

Sau khi Sửa hay Xóa, chúng ta gọi lại hàm LoadData() để nó cập nhật lại dữ liệu lên ListView cho chúng ta.

4. Thao tác Tìm kiếm trong SQLite.

Để Tìm kiếm trong SQLite, chúng ta tiến hành bắt sự kiện Click của btnTimKiem như sau:

btnTimKiem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!edtTenSV.getText().toString().trim().equals("")) {
                    arrayData = new ArrayList<>();
                    Cursor cursor = data.TruyVanTraVe("Select * from QuanLySinhVien where TenSV like '%" + edtTenSV.getText().toString().trim() + "%'");
                    while (cursor.moveToNext()) {
                        arrayData.add(new ObjectSinhvien(cursor.getInt(0), cursor.getString(1)));
                    }
                    CustomAdapter adapter = new CustomAdapter(MainActivity.this, R.layout.item, arrayData);
                    lvDanhsach.setAdapter(adapter);
                } else {
                    LoadData();
                }
            }
        });

Để Tìm kiếm, chúng ta sử dụng hàm TruyVanTraVe() của Class DataSqlite, vì câu lệnh chúng ta muốn thao tác ở Nhóm 2 (Có thể xem lại ở Phần 1, Mục 1). Bản chất của việc Tìm kiếm trong SQLite đó là chúng ta sẽ dùng một câu lệnh Select nhưng đi kèm thêm với điều kiện, ở đây mình tìm kiếm theo Tên sinh viên nên điều kiện của mình sẽ là Tên sinh viên, các bạn cũng có thể tìm kiếm theo mã, hoặc cùng lúc tìm kiếm theo Mã sinh viên và Tên sinh viên, chỉ cần chúng ta tùy biến lại câu Select mà thôi.

Trong câu lệnh trên, mình sẽ tìm kiếm tất cả Sinh viên có tên giống tên mình nhập vào EditText, sau đó đổ vào ArrayList và hiển thị lên ListView. Các bạn thấy mình dùng cú pháp like‘%’ là để lấy các dữ liệu gần giống trong SQLite (cái này các bạn có thể xem thêm bên SQL Server).

Lưu ý, cái này mình đã nói ở Phần 1 rồi nhưng mình sẽ nhắc lại, đó là chuỗi trong SQLite các bạn phải đặt trong 1 dấu nháy ‘  ‘, nếu không có dấu này khi build sẽ bị lỗi đấy nhé!!!!.

5. Tổng kết.

Sau khi các bạn code xong các phần trên, MainActivity hoàn chỉnh của chúng ta sẽ như sau:

public class MainActivity extends AppCompatActivity {

    Button btnThem, btnSua, btnXoa, btnTimKiem;
    EditText edtTenSV;
    ListView lvDanhsach;

    DataSqlite data;

    ArrayList<ObjectSinhvien> arrayData;

    int position;

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

        AnhXa();
        data = new DataSqlite(MainActivity.this, "Demo.sqlite", null, 1);
        data.TruyVanKhongTraVe("Create Table If not exists QuanLySinhVien(ID Integer Primary Key Autoincrement , TenSV Varchar)");

        LoadData();

        btnThem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!edtTenSV.getText().toString().trim().equals("")) {
                    data.TruyVanKhongTraVe("Insert into QuanLySinhVien values (null, '" + edtTenSV.getText().toString().trim() + "')");
                    Toast.makeText(MainActivity.this, "Thêm thành công sinh viên " + edtTenSV.getText().toString(), Toast.LENGTH_SHORT).show();
                    edtTenSV.setText("");
                    LoadData();
                } else {
                    Toast.makeText(MainActivity.this, "Hãy nhập tên sinh viên!!", Toast.LENGTH_SHORT).show();
                }
            }
        });

        lvDanhsach.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                edtTenSV.setText(arrayData.get(i).tenSV);
                position = i;
            }
        });

        btnSua.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!edtTenSV.getText().toString().trim().equals("")) {
                    data.TruyVanKhongTraVe("Update QuanLySinhVien set TenSV='" + edtTenSV.getText().toString().trim() + "' where ID=" + arrayData.get(position).maSV + "");
                    Toast.makeText(MainActivity.this, "Sửa thành công sinh viên" + edtTenSV.getText(), Toast.LENGTH_SHORT).show();
                    LoadData();
                } else {
                    Toast.makeText(MainActivity.this, "Hãy chọn sinh viên cần sửa!!", Toast.LENGTH_SHORT).show();
                }
            }
        });

        btnXoa.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!edtTenSV.getText().toString().trim().equals("")) {
                    data.TruyVanKhongTraVe("Delete from QuanLySinhVien where ID=" + arrayData.get(position).maSV + "");
                    Toast.makeText(MainActivity.this, "Xóa thành công sinh viên " + edtTenSV.getText(), Toast.LENGTH_SHORT).show();
                    edtTenSV.setText("");
                    LoadData();
                } else {
                    Toast.makeText(MainActivity.this, "Hãy chọn sinh viên muốn xóa!!", Toast.LENGTH_SHORT).show();
                }
            }
        });


        btnTimKiem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!edtTenSV.getText().toString().trim().equals("")) {
                    arrayData = new ArrayList<>();
                    Cursor cursor = data.TruyVanTraVe("Select * from QuanLySinhVien where TenSV like '%" + edtTenSV.getText().toString().trim() + "%'");
                    while (cursor.moveToNext()) {
                        arrayData.add(new ObjectSinhvien(cursor.getInt(0), cursor.getString(1)));
                    }
                    CustomAdapter adapter = new CustomAdapter(MainActivity.this, R.layout.item, arrayData);
                    lvDanhsach.setAdapter(adapter);
                } else {
                    LoadData();
                }
            }
        });
    }

    private void AnhXa() {
        btnThem = (Button) findViewById(R.id.btnThem);
        btnSua = (Button) findViewById(R.id.btnSua);
        btnXoa = (Button) findViewById(R.id.btnXoa);
        btnTimKiem = (Button) findViewById(R.id.btnTimkiem);
        edtTenSV = (EditText) findViewById(R.id.edtTenSV);
        lvDanhsach = (ListView) findViewById(R.id.lvDanhsach);
    }

    private void LoadData() {
        arrayData = new ArrayList<>();
        Cursor cursor = data.TruyVanTraVe("Select * From QuanLySinhVien");
        while (cursor.moveToNext()) {
            arrayData.add(new ObjectSinhvien(cursor.getInt(0), cursor.getString(1)));
        }
        CustomAdapter adapter = new CustomAdapter(MainActivity.this, R.layout.item, arrayData);
        adapter.setNotifyOnChange(true);
        lvDanhsach.setAdapter(adapter);
    }
}

Như vậy, khi đi qua 2 Phần đầu tiên của loạt bài SQLite, các bạn đã nắm được các thao tác Thêm, Sửa, XóaTìm Kiếm với SQLite trong Android rồi phải không nào?. Ở Phần 3, mình sẽ giới thiệu cho các bạn một vấn đề rất hấp dẫn đó là Intent CameraThêm ảnh vào SQLite!!

Xin Chào Và Hẹn Gặp Lại các bạn ở Phần 3.

Nguyễn Linh

Chia sẻ để cùng tiến bộ...