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

Cách sử dụng DELETE trong SQLite Android

Xóa dữ liệu trong SQLite Android

Lệnh DELETE dùng để xóa một hoặc nhiều bản ghi khỏi bảng. Có thể xóa theo điều kiện (WHERE) hoặc xóa toàn bộ bảng.

Bước 1: Tạo dự án

Android Studio → File → New Project.

Bước 2: Giao diện (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"
    android:padding="16dp">

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

    <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="8dp">
        <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/deleteAll" android:text="Xóa TẤT CẢ" android:layout_width="wrap_content" android:layout_height="wrap_content" android:backgroundTint="#FF0000" />
    </LinearLayout>

    <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" />
</LinearLayout>

Bước 3: MainActivity.java

package com.example.sqlitedelete;

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 btnSave, btnRefresh, btnUpdate, btnDeleteAll;
    EditText edtName, edtSalary;
    ListView listView;
    DatabaseHelper dbHelper;
    ArrayList dataList;
    ArrayAdapter adapter;

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

        dbHelper = new DatabaseHelper(this);
        dataList = new ArrayList<>(dbHelper.getAllContacts());
        
        edtName = findViewById(R.id.name);
        edtSalary = findViewById(R.id.salary);
        listView = findViewById(R.id.listView);
        btnSave = findViewById(R.id.save);
        btnRefresh = findViewById(R.id.refresh);
        btnUpdate = findViewById(R.id.update);
        btnDeleteAll = findViewById(R.id.deleteAll);

        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, dataList);
        listView.setAdapter(adapter);

        btnRefresh.setOnClickListener(v -> refreshList());
        
        btnSave.setOnClickListener(v -> {
            String name = edtName.getText().toString().trim();
            String salary = edtSalary.getText().toString().trim();
            if (name.isEmpty() || salary.isEmpty()) {
                showError(name, salary);
                return;
            }
            if (dbHelper.insert(name, salary)) {
                Toast.makeText(this, "Đã thêm", Toast.LENGTH_SHORT).show();
                refreshList();
            } else {
                Toast.makeText(this, "Thêm thất bại", Toast.LENGTH_SHORT).show();
            }
        });

        btnUpdate.setOnClickListener(v -> {
            String name = edtName.getText().toString().trim();
            String salary = edtSalary.getText().toString().trim();
            if (name.isEmpty() || salary.isEmpty()) {
                showError(name, salary);
                return;
            }
            if (dbHelper.update(name, salary)) {
                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();
            }
        });

        btnDeleteAll.setOnClickListener(v -> {
            if (dbHelper.deleteAll()) {
                Toast.makeText(this, "Đã xóa TẤT CẢ", Toast.LENGTH_LONG).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());
        adapter.notifyDataSetChanged();
    }

    private void showError(String name, String salary) {
        if (name.isEmpty()) edtName.setError("Nhập tên");
        if (salary.isEmpty()) edtSalary.setError("Nhập lương");
    }
}

Bước 4: DatabaseHelper.java

package com.example.sqlitedelete;

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 = "salaryDatabase";
    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) {
        db.execSQL("CREATE TABLE " + TABLE_NAME + 
            "(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, salary TEXT)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldV, int newV) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }

    public boolean insert(String name, String salary) {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put("name", name);
        cv.put("salary", salary);
        return db.insert(TABLE_NAME, null, cv) != -1;
    }

    public ArrayList getAllContacts() {
        ArrayList list = new ArrayList<>();
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
        if (cursor.moveToFirst()) {
            do {
                list.add(cursor.getString(cursor.getColumnIndex("name")));
            } while (cursor.moveToNext());
        }
        cursor.close();
        return list;
    }

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

    // XÓA TOÀN BỘ BẢNG
    public boolean deleteAll() {
        SQLiteDatabase db = getWritableDatabase();
        int rowsDeleted = db.delete(TABLE_NAME, null, null);
        // Hoặc: db.execSQL("DELETE FROM " + TABLE_NAME);
        return rowsDeleted > 0;
    }

    // XÓA CÓ ĐIỀU KIỆN (ví dụ)
    public boolean deleteByName(String name) {
        SQLiteDatabase db = getWritableDatabase();
        return db.delete(TABLE_NAME, "name = ?", new String[]{name}) > 0;
    }

    public boolean deleteWhereSalaryLessThan(String salary) {
        SQLiteDatabase db = getWritableDatabase();
        return db.delete(TABLE_NAME, "salary < ?", new String[]{salary}) > 0;
    }
}

Các dạng lệnh DELETE

-- 1. Xóa tất cả (giữ cấu trúc bảng, auto-increment reset tùy DB)
DELETE FROM SalaryDetails;

-- 2. Xóa có điều kiện
DELETE FROM SalaryDetails WHERE name = 'An';
DELETE FROM SalaryDetails WHERE salary > '5000';
DELETE FROM SalaryDetails WHERE name LIKE 'A%';

-- 3. Xóa và reset auto-increment (SQLite)
DELETE FROM SalaryDetails;
DELETE FROM sqlite_sequence WHERE name = 'SalaryDetails'; -- Reset ID

-- 4. TRUNCATE (nhanh hơn, không trigger, không rollback) - SQLite KHÔNG HỖ TRỢ TRUNCATE
-- Chỉ dùng DELETE FROM table

Best Practices

  • Luôn dùng WHERE khi xóa có chọn lọc - tránh xóa nhầm toàn bộ dữ liệu.
  • Dùng db.delete(table, whereClause, whereArgs) thay vì rawQuery để tránh SQL Injection.
  • Xóa hàng loạt: cân nhắc transaction để hiệu năng tốt hơn.
  • Backup trước khi xóa quan trọng (export CSV/JSON).

⚠️ Cảnh báo

DELETE không có WHERE sẽ xóa toàn bộ dữ liệu không thể khôi phục! Luôn xác nhận từ người dùng trước khi thực hiện xóa tất cả.