Trong Android, SQLiteOpenHelper là một lớp tiện ích giúp quản lý cơ sở dữ liệu SQLite cục bộ. Nó cung cấp các phương thức đơn giản hóa việc tạo, nâng cấp và quản lý cơ sở dữ liệu. Bằng cách sử dụng SQLiteOpenHelper, bạn có thể tránh phải trực tiếp thao tác với các lệnh SQL để tạo và nâng cấp cơ sở dữ liệu.

Dưới đây là hướng dẫn chi tiết về cách sử dụng SQLiteOpenHelper trong Android.

1. Tạo Lớp Mở Rộng SQLiteOpenHelper

Để sử dụng SQLiteOpenHelper, bạn cần tạo một lớp con của nó và override hai phương thức chính: onCreate()onUpgrade().

  • onCreate(): Phương thức này được gọi khi cơ sở dữ liệu được tạo lần đầu. Bạn có thể tạo các bảng trong đây.
  • onUpgrade(): Phương thức này được gọi khi cơ sở dữ liệu cần được nâng cấp (ví dụ: khi thay đổi cấu trúc bảng).

Ví dụ:

public class DatabaseHelper extends SQLiteOpenHelper {

    // Tên cơ sở dữ liệu
    private static final String DATABASE_NAME = "my_database.db";
    // Phiên bản cơ sở dữ liệu
    private static final int DATABASE_VERSION = 1;

    // Cấu trúc bảng
    private static final String TABLE_NAME = "users";
    private static final String COLUMN_ID = "id";
    private static final String COLUMN_NAME = "name";
    private static final String COLUMN_EMAIL = "email";

    // Tạo bảng SQL
    private static final String TABLE_CREATE =
            "CREATE TABLE " + TABLE_NAME + " (" +
            COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COLUMN_NAME + " TEXT, " +
            COLUMN_EMAIL + " TEXT);";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // Tạo bảng khi cơ sở dữ liệu được tạo
        db.execSQL(TABLE_CREATE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Xóa bảng cũ và tạo lại khi cơ sở dữ liệu được nâng cấp
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }
}

2. Sử Dụng SQLiteOpenHelper Để Thao Tác Dữ Liệu

Sau khi tạo lớp DatabaseHelper, bạn có thể sử dụng nó để thao tác với cơ sở dữ liệu. Dưới đây là cách thực hiện các thao tác CRUD (Create, Read, Update, Delete).

2.1 Thêm Dữ Liệu (Create)

Sử dụng phương thức insert() của SQLiteDatabase để thêm dữ liệu vào bảng.

public void addUser(String name, String email) {
    SQLiteDatabase db = this.getWritableDatabase();
    
    ContentValues values = new ContentValues();
    values.put(COLUMN_NAME, name);
    values.put(COLUMN_EMAIL, email);

    // Thêm một dòng mới
    db.insert(TABLE_NAME, null, values);
    db.close(); // Đóng kết nối cơ sở dữ liệu
}

2.2 Đọc Dữ Liệu (Read)

Sử dụng phương thức query() để lấy dữ liệu từ bảng.

public Cursor getAllUsers() {
    SQLiteDatabase db = this.getReadableDatabase();

    String[] projection = {
            COLUMN_ID,
            COLUMN_NAME,
            COLUMN_EMAIL
    };

    // Thực hiện truy vấn
    Cursor cursor = db.query(
            TABLE_NAME,    // Tên bảng
            projection,    // Cột cần truy vấn
            null,          // Điều kiện WHERE
            null,          // Giá trị WHERE
            null,          // Nhóm bảng (groupBy)
            null,          // Điều kiện having
            null           // Điều kiện sắp xếp (orderBy)
    );

    return cursor;
}

Sau đó bạn có thể lặp qua Cursor để lấy dữ liệu:

Cursor cursor = databaseHelper.getAllUsers();
if (cursor.moveToFirst()) {
    do {
        String name = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_NAME));
        String email = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_EMAIL));
        // Xử lý dữ liệu
    } while (cursor.moveToNext());
}
cursor.close();

2.3 Cập Nhật Dữ Liệu (Update)

Sử dụng phương thức update() để cập nhật dữ liệu.

public void updateUser(int id, String name, String email) {
    SQLiteDatabase db = this.getWritableDatabase();
    
    ContentValues values = new ContentValues();
    values.put(COLUMN_NAME, name);
    values.put(COLUMN_EMAIL, email);

    // Cập nhật dữ liệu trong bảng
    db.update(TABLE_NAME, values, COLUMN_ID + " = ?", new String[]{String.valueOf(id)});
    db.close();
}

2.4 Xóa Dữ Liệu (Delete)

Sử dụng phương thức delete() để xóa dữ liệu.

public void deleteUser(int id) {
    SQLiteDatabase db = this.getWritableDatabase();

    // Xóa dòng dữ liệu từ bảng
    db.delete(TABLE_NAME, COLUMN_ID + " = ?", new String[]{String.valueOf(id)});
    db.close();
}

3. Quản Lý Phiên Bản Cơ Sở Dữ Liệu

Khi bạn cần thay đổi cấu trúc cơ sở dữ liệu (ví dụ: thêm cột mới, thay đổi kiểu dữ liệu), bạn phải tăng phiên bản cơ sở dữ liệu (DATABASE_VERSION) trong SQLiteOpenHelper. Sau đó, phương thức onUpgrade() sẽ được gọi, nơi bạn có thể thực hiện thay đổi cần thiết cho cơ sở dữ liệu.

Ví dụ:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < 2) {
        // Thêm cột mới trong phiên bản 2
        db.execSQL("ALTER TABLE " + TABLE_NAME + " ADD COLUMN phone TEXT");
    }
}

4. Kết Luận

SQLiteOpenHelper giúp quản lý cơ sở dữ liệu trong Android một cách đơn giản hơn, với khả năng tạo, nâng cấp, và thực hiện các thao tác CRUD dễ dàng. Nó giúp bạn tập trung vào xử lý dữ liệu mà không phải lo lắng quá nhiều về các lệnh SQL thuần túy.