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 tệp 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ệ. Để 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 hay ODBC.
Ví dụ: Xóa bảng trong SQLite
Hướng dẫn này minh họa cách sử dụng câu lệnh DROP TABLE để xóa hoàn toàn một bảng khỏi cơ sở dữ liệu.
Bước 1: Tạo dự án mới
Mở Android Studio, chọn File → New Project và đ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" />
<Button
android:id="@+id/save"
android:text="Lưu"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
Bước 3: Code MainActivity.java
package com.example.andy.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
Button save;
EditText name, salary;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final DatabaseHelper helper = new DatabaseHelper(this);
name = findViewById(R.id.name);
salary = findViewById(R.id.salary);
findViewById(R.id.save).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String nameStr = name.getText().toString().trim();
String salaryStr = salary.getText().toString().trim();
if (!nameStr.isEmpty() && !salaryStr.isEmpty()) {
if (helper.insert(nameStr, salaryStr)) {
Toast.makeText(MainActivity.this, "Đã thêm", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this, "Không thêm được", Toast.LENGTH_LONG).show();
}
} else {
name.setError("Nhập TÊN");
salary.setError("Nhập LƯƠNG");
}
}
});
}
}
Bước 4: Code DatabaseHelper.java
package com.example.andy.myapplication;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import java.io.IOException;
class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "salaryDatabase3";
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)");
} catch (SQLiteException e) {
try { throw new IOException(e); }
catch (IOException e1) { e1.printStackTrace(); }
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Cách xóa bảng: DROP TABLE IF EXISTS
db.execSQL("DROP TABLE IF EXISTS " + CONTACTS_TABLE_NAME);
onCreate(db);
}
public boolean insert(String name, String salary) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("name", name);
contentValues.put("salary", salary);
db.insert(CONTACTS_TABLE_NAME, null, contentValues);
return true;
}
}
Cú pháp xóa bảng
db.execSQL("DROP TABLE IF EXISTS " + CONTACTS_TABLE_NAME);
Giải thích DROP TABLE
- DROP TABLE: Xóa hoàn toàn bảng (cấu trúc + dữ liệu + index + trigger)
- IF EXISTS: Tránh lỗi nếu bảng không tồn tại (không crash ứng dụng)
- Không thể hoàn tác (không có UNDO)
- Khác với
DELETE FROM table(chỉ xóa dữ liệu, giữ cấu trúc bảng)
Khi nào dùng DROP TABLE?
- onUpgrade(): Khi nâng cấp phiên bản DB, cần thay đổi schema (thêm/xóa cột, đổi kiểu dữ liệu)
- Reset dữ liệu test: Xóa bảng cũ, tạo lại mới
- Gỡ cài đặt tính năng: Xóa bảng không còn dùng
Lưu ý quan trọng
⚠️ Cẩn thận khi DROP TABLE trong production
- Mất toàn bộ dữ liệu trong bảng - không thể khôi phục
- Nên backup dữ liệu trước khi drop
- Trong
onUpgrade(), hãy migrate dữ liệu sang bảng mới thay vì drop đơn thuần - Ví dụ migrate: CREATE TABLE new_table ... → INSERT INTO new_table SELECT ... FROM old_table → DROP old_table → RENAME new_table
ALTER TABLE - Thay thế DROP khi chỉ cần sửa schema
SQLite hỗ trợ ALTER TABLE cho một số thao tác (từ API 16+):
-- Thêm cột mới ALTER TABLE SalaryDetails ADD COLUMN email TEXT; -- Đổi tên bảng ALTER TABLE SalaryDetails RENAME TO EmployeeDetails; -- Đổi tên cột (SQLite 3.25.0+) ALTER TABLE SalaryDetails RENAME COLUMN salary TO wage;
Dùng ALTER TABLE thay vì DROP + CREATE để bảo toàn dữ liệu hiện có.