SQLiteOpenHelper trong Android

Mặc dù bạn vẫn có thể sử dụng cách kết nối, truy vấn dữ liệu như ở ví dụ trước Sử dụng SQLite trong Android, tuy nhiên với lớp SQLiteOpenHelper giúp việc tập trung hoá code, quản lý - tạo / nâng cấp DB rõ ràng hơn.

Bạn chỉ cần triển khai lớp SQLiteOpenHelper và viết các lệnh tập trung CRUD trên các bảng dữ liệu quản lý. Trong đối tượng triển khai SQLiteOpenHelper nếu muốn có SQLiteDatabase thì gọi các phương thức:

//Khi cần đọc dữ liệu (SELECT)
SQLiteDatabase db = getReadableDatabase();

//Khi cần cập nhật dữ liệu (CREATE, DELETE, UPDATE, INSERT)
SQLiteDatabase db = getWritableDatabase();

Triển khai tối thiểu SQLiteOpenHelper tham khảo đoạn code sau:

class MyDBHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "dbname.db";
    private static final int    DATABASE_VERSION = 1;

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        // Phương thức này tự động gọi nếu storage chưa có DATABASE_NAME
        // Ban viết code để tạo DB
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //Phương thức này tự động gọi khi đã có DB trên Storage, nhưng phiên bản khác
        //với DATABASE_VERSION
        //Bạn cần thực hiện các thao tác để nâng cấp phiên bản
    }

     void doSomething() {
        SQLiteDatabase db = getWritableDatabase();
        //...
    }
}

Ví dụ SQLiteOpenHelper

Tiến hành cải tiến ví dụ phần trước, Sử dụng SQLite trong Android, mọi thao tác với DB sẽ tập trung ở lớp triển khai SQLiteOpenHelper có tên ProductDbHelper, nôi dung như sau:

package net.xuanthulab.sqlitetutorial;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.support.annotation.Nullable;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

public class ProductDbHelper extends SQLiteOpenHelper {
    private static final String TAG = "ProductDbHelper";
    private static final String DATABASE_NAME = "myproduct.db";
    private static final int DATABASE_VERSION = 1;
    private static final String TABLE_PRODUCT = "product";


    public ProductDbHelper(@Nullable Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Phương thức này tự động gọi nếu storage chưa có DATABASE_NAME
    @Override
    public void onCreate(SQLiteDatabase db) {

        Log.i(TAG, "Create table");
        String queryCreateTable = "CREATE TABLE " + TABLE_PRODUCT + " ( " +
                "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "name VARCHAR (255) NOT NULL, " +
                "price DECIMAL DEFAULT (0)" +
                ")";

        db.execSQL(queryCreateTable);
    }

    //Phương thức này tự động gọi khi đã có DB trên Storage, nhưng phiên bản khác
    //với DATABASE_VERSION
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //Xoá bảng cũ
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_PRODUCT);
        //Tiến hành tạo bảng mới
        onCreate(db);
    }


    //Lấy toàn bộ SP
    public List<Product> getAllProducts() {

        List<Product> products = new ArrayList<>();

        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT id, name, price from product", null);

        //Đến dòng đầu của tập dữ liệu
        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            int productID = cursor.getInt(0);
            String productName = cursor.getString(1);
            int productPrice = cursor.getInt(2);

            products.add(new Product(productID, productName, productPrice));
            cursor.moveToNext();
        }

        cursor.close();

        return products;
    }


    //Lấy một SP biết ID
    public Product getProductByID(int ID) {
        Product product = null;
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT id, name, price from product where id = ?",
                new String[]{ID + ""});

        if (cursor.getCount() > 0) {
            cursor.moveToFirst();
            int productID = cursor.getInt(0);
            String productName = cursor.getString(1);
            int productPrice = cursor.getInt(2);
            product = new Product(productID, productName, productPrice);
        }
        cursor.close();
        return product;
    }

    //Cập nhật
    void updateProduct(Product product) {
        SQLiteDatabase db = getWritableDatabase();
        db.execSQL("UPDATE product SET name=?, price = ? where id = ?",
                new String[]{product.name, product.price + "", product.productID + ""});
    }

    //Chèn mới
    void insertProduct(Product product) {
        SQLiteDatabase db = getWritableDatabase();
        db.execSQL("INSERT INTO product (name, price ) VALUES (?,?)",
                new String[]{product.name, product.price + ""});
    }

    //Xoá sản phẩm khỏi DB
    void deleteProductByID(int ProductID) {
        SQLiteDatabase db = getWritableDatabase();
        db.execSQL("DELETE FROM product where id = ?", new String[]{String.valueOf(ProductID)});
    }
}

Khi áp dụng, trong các Activity tạo ra đối tượng dạng:

productDbHelper = new ProductDbHelper(this);

Ví dụ khi nạp các sản phẩm trong MainActivity, phiên bản loadDbProduct giờ trở thành

 private void loadDbProduct() {
        listProduct.clear();
        listProduct.addAll(productDbHelper.getAllProducts());
}

Toàn bộ code ví dự lưu tại android-sqlite-example2

Có thể tải về bằng Git

git clone git@github.com:xuanthulabnet/android-sqlite-example2.git
Đăng ký theo dõi ủng hộ kênh