Xây dựng 1 thư viện nhỏ hỗ trợ tạo query SQLite (Phần 1 - Giới thiệu về thư viện QueryHelper tự tạo)

Bạn gặp khó khăn hay chán ngán việc phải tự tạo các câu lệnh select sql ! Dưới đây mình sẽ hướng dẫn các bạn tạo và sử dụng thư viện hỗ trợ tạo câu lệnh query SQLite !

  1. Class chính của thư viện QueryHelper 1.1. Join bảng 1.1.1. Khi chỉ cần select 1 bảng -> chúng ta chỉ cần truyền tên bảng cần select vào
    /**
     * use if select in 1 table
     *
     * @param tableName
     * @return QueryHelper
     */
    public QueryHelper setTableName(String tableName) {
        mTableName = tableName;
        return this;
    }

1.1.2. Khi muốn select từ nhiều bảng với nhau Chúng ta cần truyền tên 2 bảng và khóa ngoài kết nối 2 bảng

    /**
     * use if select with multiple table (join two table)
     *
     * @param masterTableName
     * @param valueTableName
     * @param columnMasterTableName
     * @param columnValueTableName
     * @return QueryHelper
     */
    public QueryHelper setJoinTable(String masterTableName,
                                    String valueTableName,
                                    String columnMasterTableName,
                                    String columnValueTableName) {
        StringBuilder builder = new StringBuilder();
        if (TextUtils.isEmpty(mJoinTable)) {
            builder.append(masterTableName);
        }
        builder.append(JOIN)
            .append(valueTableName)
            .append(ON)
            .append(columnMasterTableName)
            .append(" = ")
            .append(columnValueTableName);
        mJoinTable += builder.toString();
        return this;
    }

    /**
     * @param joinTable query join multiple table
     * @return QueryHelper
     */
    public QueryHelper setJoinTable(String joinTable) {
        mJoinTable = joinTable;
        return this;
    }

1.1.3. Khi bạn tự muốn viết câu select join bảng ( thường dùng nếu nối nhiều bảng phức tạp)

    /**
     * @param joinTable query join multiple table
     * @return QueryHelper
     */
    public QueryHelper setJoinTable(String joinTable) {
        mJoinTable = joinTable;
        return this;
    }

1.2. Muốn lấy giá trị của các cột 1.2.1. Muốn lấy tất cả giá trị của các cột

  • Không dùng cả 3 function dưới đây : (mặc định không dùng sẽ select *) addColumn, addAllColumns và setColumns

1.2.2. Lấy giá trị của 1 cột

     /**
     * @param columnName
     * @return QueryHelper
     */
    public QueryHelper addColumn(String columnName) {
        mColumnList.add(columnName);
        return this;
    }

1.2.3. Khi bạn muốn select nhiều cột

    /**
     * @param columnList
     * @return QueryHelper
     */
    public QueryHelper addAllColumns(List<String> columnList) {
        mColumnList.addAll(columnList);
        return this;
    }

1.2.4. Khi bạn muốn set lại các cột muốn select

     /**
     * @param columnList
     * @return QueryHelper
     */
    public QueryHelper setColumns(List<String> columnList) {
        mColumnList.clear();
        addAllColumns(columnList);
        return this;
    }

1.3. Function xử lý tạo câu lệnh select các cột từ list column : mColumnList

Mặc định nếu mColumnList không có phần tử nào thì sẽ tiến hành select all ( select *)

    /**
     * @return String select all ( * ) or select column
     */
    private String getSelectColumn() {
        StringBuilder selectColumn = new StringBuilder();
        if (mColumnList.size() == 0) selectColumn.append(" * ");
        else {
            for (String column : mColumnList) {
                if (!TextUtils.isEmpty(selectColumn)) {
                    selectColumn.append(", ");
                }
                selectColumn.append(column);
            }
        }
        return selectColumn.toString();
    }

1.4. Thêm điều kiện where
1.4.1. Function đầy đủ

Truyền vào tên cột, giá trị và boolean có query Like không ?

    /**
     * add condition search extend
     *
     * @param columnName
     * @param val
     * @param queryLike
     * @return
     */
    public QueryHelper addCondition(String columnName, Object val, boolean queryLike) {
        String newWhere = "";
        if (val != null && !TextUtils.isEmpty(val.toString())) {
            if (queryLike && val instanceof String) {
                newWhere += columnName + LIKE + " ? ";
                mSelectionArgs.put(columnName, "%" + val + "%");
            } else {
                newWhere += columnName + " = ? ";
                mSelectionArgs.put(columnName, val);
            }
        } else {
                newWhere+=columnName +" is null ";
        }
        concatWhereClause(newWhere);
        return this;
    }

1.4.2 Hàm default

Mặc đinh sẽ ko thêm điều kiện search Like nữa !

     /**
     * add condition search default
     *
     * @param columnName
     * @param val
     * @return
     */
    public QueryHelper addCondition(String columnName, Object val) {
        return addCondition(columnName, val, false);
    }

1.4.3. Function nối các điều kiện where

     /**
     * check mWhereClause add `AND`
     *
     * @param newWhere
     * @return
     */
    public QueryHelper concatWhereClause(String newWhere) {
        if (!TextUtils.isEmpty(newWhere)) {
            if (!TextUtils.isEmpty(mWhereClause)) {
                mWhereClause += AND;
            }
            mWhereClause += newWhere;
        }
        return this;
    }

1.5. Thêm điều kiện sắp xếp (order By) 1.5.1. Function đầy đủ truyền vào tên cột và boolean isDesc kiểu sắp xếp (DESC or ASC)

    /**
     * choose sort
     *
     * @param columnName
     * @param isDesc
     * @return
     */
    public QueryHelper addOrderBy(String columnName, boolean isDesc) {
        if (TextUtils.isEmpty(columnName)) {
            return this;
        }
        String newOrderBy = columnName;
        newOrderBy += isDesc ? DESC : ASC;
        concatOrderByClause(newOrderBy);
        return this;
    }

1.5.2. Function default

Truyền vào tên cột , mặc định isDesc = false

     /**
     * add order by default
     *
     * @param columnName
     * @return
     */
    public QueryHelper addOrderBy(String columnName) {
        return addOrderBy(columnName, false);
    }

1.5.3. Function nối các điều kiện order By

     /**
     * add ", " for sql query
     *
     * @param newOrderBy
     * @return
     */
    public QueryHelper concatOrderByClause(String newOrderBy) {
        if (!TextUtils.isEmpty(newOrderBy)) {
            if (!TextUtils.isEmpty(mOrderByClause)) {
                mOrderByClause += ", ";
            }
            mOrderByClause += newOrderBy;
        }
        return this;
    }

1.6 Tương tự với orderBy mình có function groupBy

Truyền vào tên cột


 public QueryHelper addGroupBy(String columnName) {
        if (TextUtils.isEmpty(columnName)) {
            return this;
        }
        String newGroupBy = columnName;
        concatGroupByClause(newGroupBy);
        return this;
    }
    
 public QueryHelper concatGroupByClause(String newGroupBy) {
        if (!TextUtils.isEmpty(newGroupBy)) {
            if (!TextUtils.isEmpty(mGroupByClause)) {
                mGroupByClause += ", ";
            }
            mGroupByClause += newGroupBy;
        }
        return this;
    }

1.7. Điều kiện having

public QueryHelper addHaving(String having) {
        mHavingClause = having;
        return this;
    }

1.8. Đìều kiện limit

 public QueryHelper addLimit(String limit) {
        mLimitClause = limit;
        return this;
    }

1.9. Điều kiện offset

 public QueryHelper addOffset(String offset) {
        mOffsetClause = offset;
        return this;
    }

1.10. Function tạo ra câu lệnh query Từ các điều kiện đã truyền vào ở trên để tạo ra câu lệnh query

  • getSelectColumn() để lấy tên các cột muốn lấy dữ liệu ( mặc định là *)
  • !TextUtils.isEmpty(mJoinTable) ? mJoinTable : mTableName -> mục đích là xem select từ 1 bảng hay nhiều bảng
  • !TextUtils.isEmpty(mWhereClause) ? WHERE + mWhereClause : "" -> thêm điều kiện where
  • !TextUtils.isEmpty(mGroupByClause) ? GROUP_BY + mGroupByClause : "" -> thêm điều kiện group By
  • !TextUtils.isEmpty(mGroupByClause) && !TextUtils.isEmpty(mHavingClause) ? HAVING + mHavingClause : "" -> thêm điều kiện having ( chỉ có khi có điều kiện group By)
  • !TextUtils.isEmpty(mOrderByClause) ? ORDER_BY + mOrderByClause : " " -> thêm điều kiện order By
  • (!TextUtils.isEmpty(mLimitClause) ? LIMIT + mLimitClause : "" -> thêm điều kiện limit
  • !TextUtils.isEmpty(mLimitClause) && !TextUtils.isEmpty(mOffsetClause) ? OFFSET + mOffsetClause : "" -> thêm điều kiện offset (chỉ có khi có điều kiện limit)
public String getSqlQuery() {
        StringBuilder sqlQuery = new StringBuilder();
        sqlQuery.append(SELECT)
            .append(getSelectColumn())
            .append(FROM)
            .append(!TextUtils.isEmpty(mJoinTable) ? mJoinTable : mTableName)
            .append(!TextUtils.isEmpty(mWhereClause) ? WHERE + mWhereClause : "")
            .append(!TextUtils.isEmpty(mGroupByClause) ? GROUP_BY + mGroupByClause : "")
            .append(!TextUtils.isEmpty(mGroupByClause) && !TextUtils.isEmpty(mHavingClause)
                ? HAVING + mHavingClause : "")
            .append(!TextUtils.isEmpty(mOrderByClause) ? ORDER_BY + mOrderByClause : "")
            .append(!TextUtils.isEmpty(mLimitClause) ? LIMIT + mLimitClause : "")
            .append(!TextUtils.isEmpty(mLimitClause) && !TextUtils.isEmpty(mOffsetClause)
                ? OFFSET + mOffsetClause : "");
        return sqlQuery.toString();
    }

1.11. Lấy các giá trị selectionArgs

     /**
     * @return String[] selectionArgs
     */
   public String[] getSelectionArgs() {
        List<String> keySets = new ArrayList<>(mSelectionArgs.keySet());
        int size = keySets.size();
        int index = 0;
        String[] paramMap = new String[size];
        for (int i = size - 1; i >= 0; i--) {
            paramMap[index] = mSelectionArgs.get(keySets.get(i)).toString();
            index++;
        }
        return paramMap;
    }

2.1. Các dùng đơn giản nhất Dùng trong DatabaseHelper Tạo 1 function query();

public Cursor query(QueryHelper queryHelper) {
        SQLiteDatabase db = getReadableDatabase();
        return db.rawQuery(queryHelper.getSqlQuery(), queryHelper.getSelectionArgs());
    }

2.2. Các sử dụng cụ thể và demo mình sẽ viết trong phần 2 : Code full : Các bạn có thể xem trước ở đây Github