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ài đăng này đã không được cập nhật trong 7 năm
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
All rights reserved