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 ! 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 ...
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 !
- 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