Xây dựng 1 thư viện nhỏ hỗ trợ tạo query SQLite (Phần 2 - Hướng dẫn cách sử dụng)

Như phần 1 mình đã giới thiệu chung về cấu trúc của class QueryHelper, hôm nay mình sẽ hướng dẫn tiếp các bạn cách sử dụng nó vào thực tế

1. Function query

Xử lý:
- queryHelper.getSqlQuery() để lấy câu lệnh query
- queryHelper.getSelectionArgs() để lấy mảng giá trị cần check
 public Cursor query(QueryHelper queryHelper) {
        SQLiteDatabase db = getReadableDatabase();
        return db.rawQuery(queryHelper.getSqlQuery(), queryHelper.getSelectionArgs());
    }

2. Tạo class DatabaseManager

để thực hiện truy xuất dữ liệu

package com.example.tuananh.databasehelper.database;

import android.content.Context;
import android.database.Cursor;

import com.example.tuananh.databasehelper.enums.TypeSearch;
import com.example.tuananh.databasehelper.model.ItemSearch;
import com.tuananh.databasehelper.queryhelper.QueryHelper;

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

import static com.example.tuananh.databasehelper.database.DBConstant.FIELD_EN_VALUE;
import static com.example.tuananh.databasehelper.database.DBConstant.FIELD_ID;
import static com.example.tuananh.databasehelper.database.DBConstant.FIELD_JA_VALUE;
import static com.example.tuananh.databasehelper.database.DBConstant.FIELD_KEY;
import static com.example.tuananh.databasehelper.database.DBConstant.TABLE_DEGREE;
import static com.example.tuananh.databasehelper.database.DBConstant.TABLE_M_DEGREE;

/**
 * Created by framgia on 26/02/2017.
 */
public class DatabaseManager implements DatabaseInterface {
    private static DatabaseManager sInstance;
    private Context mContext;

    private DatabaseManager(Context context) {
        mContext = context;
    }

    public static synchronized DatabaseManager getInstance(Context context) {
        if (sInstance == null) {
            sInstance = new DatabaseManager(context.getApplicationContext());
        }
        return sInstance;
    }

    @Override
    public List<ItemSearch> getItemSearch(TypeSearch typeSearch) {
        QueryHelper queryHelper = new QueryHelper();
        String masterTableName, valueTableName, columnMasterTableName, columnValueTableName;
        switch (typeSearch) {
            case DEGREES:
                masterTableName = TABLE_M_DEGREE;
                valueTableName = TABLE_DEGREE;
                break;
            default:
                return null;
        }
        columnMasterTableName = masterTableName + "." + FIELD_KEY;
        columnValueTableName = valueTableName + "." + FIELD_KEY;
        queryHelper.addColumn(masterTableName + "." + FIELD_ID);
        queryHelper.addColumn(valueTableName + "." + FIELD_EN_VALUE);
        queryHelper.addColumn(valueTableName + "." + FIELD_JA_VALUE);
        queryHelper.addOrderBy(FIELD_EN_VALUE);
        queryHelper.setJoinTable(masterTableName, valueTableName,
            columnMasterTableName,
            columnValueTableName);
        return getItemSearchList(queryHelper);
    }

    public List<ItemSearch> getItemSearchList(QueryHelper queryHelper) {
        List<ItemSearch> itemSearchList = new ArrayList<>();
        Cursor cursor = DBHelper.getInstance(mContext).query(queryHelper);
        if (cursor != null && cursor.moveToFirst()) {
            do {
                try {
                    int id = cursor.getInt(cursor.getColumnIndex(FIELD_ID));
                    String enValues = cursor.getString(cursor.getColumnIndex(FIELD_EN_VALUE));
                    String jaValues = cursor.getString(cursor.getColumnIndex(FIELD_JA_VALUE));
                    ItemSearch itemSearch = new ItemSearch(id, enValues, jaValues);
                    itemSearchList.add(itemSearch);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
            while (cursor.moveToNext());
        }
        return itemSearchList;
    }
}

  • Trong đó function getItemSearchList thực hiện try catch để lấy dữ liệu ra

  • Cursor cursor = DBHelper.getInstance(mContext).query(queryHelper); từ queryHelper tạo từ getItemSearch chúng ta lấy ra cursor

  • Trong function getItemSearch thực hiện việc add các điều kiện để tạo ra câu lệnh query : Các cột được lấy ra : queryHelper.addColumn(masterTableName + "." + FIELD_ID); queryHelper.addColumn(valueTableName + "." + FIELD_EN_VALUE); queryHelper.addColumn(valueTableName + "." + FIELD_JA_VALUE);

    Order by : queryHelper.addOrderBy(FIELD_EN_VALUE);

    Nối 2 bảng :
    queryHelper.setJoinTable(masterTableName, valueTableName, columnMasterTableName, columnValueTableName);

    Limit : queryHelper.addLimit("10");

    Điều kiện : queryHelper.addCondition(valueTableName + "." + FIELD_ID, 5);

3. Class DatabaseInterface

để chứa các phương thức truy xuất dữ liệu (nên chia theo chức năng có thể tạo nhiều interface)

package com.example.tuananh.databasehelper.database;

import com.example.tuananh.databasehelper.enums.TypeSearch;
import com.example.tuananh.databasehelper.model.ItemSearch;

import java.util.List;
import java.util.Map;

/**
 * Created by framgia on 26/02/2017.
 */
public interface DatabaseInterface {
    List<ItemSearch> getItemSearch(TypeSearch typeSearch);
}

4. Class DBConstant

  • chứa các field trong database
  • chứa tên của các bảng trong database
package com.example.tuananh.databasehelper.database;

/**
 * Created by framgia on 26/02/2017.
 */
public class DBConstant {
    public static final String FIELD_KEY = "key";
    public static final String FIELD_ID = "id";
    public static final String FIELD_EN_VALUE = "enValue";
    public static final String FIELD_JA_VALUE = "jaValue";
    public static final String TABLE_M_DEGREE = "m_degrees";
    public static final String TABLE_DEGREE = "degrees";
}

5. Class ItemSearch

Chứa 3 thông tin sẽ hiển thị trên reyclerview

package com.example.tuananh.databasehelper.model;

import com.google.gson.annotations.SerializedName;

/**
 * Created by framgia on 26/02/2017.
 */
public class ItemSearch {
    @SerializedName("id")
    private int mId;
    @SerializedName("enValue")
    private String mEnValue;
    @SerializedName("jaValue")
    private String mJaValue;

    public ItemSearch(int id, String enValue, String jaValue) {
        mId = id;
        mEnValue = enValue;
        mJaValue = jaValue;
    }

    public int getId() {
        return mId;
    }

    public String getEnValue() {
        return mEnValue;
    }

    public String getJaValue() {
        return mJaValue;
    }
}

6. Class SearchRecyclerAdapter

Adapter của recyclerview -> Mình viết theo kiểu truyền thống nhất

package com.example.tuananh.databasehelper.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.example.tuananh.databasehelper.R;
import com.example.tuananh.databasehelper.model.ItemSearch;

import java.util.List;

/**
* Created by framgia on 26/02/2017.
*/
public class SearchRecyclerAdapter
   extends RecyclerView.Adapter<SearchRecyclerAdapter.SearchViewHolder> {
   private List<ItemSearch> mItemSearchList;
   private LayoutInflater mLayoutInflater;

   public SearchRecyclerAdapter(Context context, List<ItemSearch> itemSearchList) {
       mItemSearchList = itemSearchList;
       mLayoutInflater = LayoutInflater.from(context);
   }

   @Override
   public SearchViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
       View itemView = mLayoutInflater.inflate(R.layout.item_search, parent, false);
       return new SearchViewHolder(itemView);
   }

   @Override
   public void onBindViewHolder(SearchViewHolder holder, int position) {
       ItemSearch itemSearch = mItemSearchList.get(position);
       holder.mTextViewId.setText(String.valueOf(itemSearch.getId()));
       holder.mTextViewValueEn.setText(itemSearch.getEnValue());
       holder.mTextViewValueJa.setText(itemSearch.getJaValue());
   }

   @Override
   public int getItemCount() {
       return mItemSearchList != null ? mItemSearchList.size() : 0;
   }

   public static class SearchViewHolder extends RecyclerView.ViewHolder {
       private TextView mTextViewId, mTextViewValueEn, mTextViewValueJa;

       public SearchViewHolder(View itemView) {
           super(itemView);
           mTextViewId = (TextView) itemView.findViewById(R.id.text_id);
           mTextViewValueEn = (TextView) itemView.findViewById(R.id.text_value_en);
           mTextViewValueJa = (TextView) itemView.findViewById(R.id.text_value_ja);
       }
   }
}

7. Class MainActivity

Function loadData() sẽ thực hiện gọi đến DatabaseManager.getInstance(this).getItemSearch(typeSearch); để load dữ liệu từ database addAll vào list

package com.example.tuananh.databasehelper;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;

import com.example.tuananh.databasehelper.adapter.SearchRecyclerAdapter;
import com.example.tuananh.databasehelper.database.DatabaseManager;
import com.example.tuananh.databasehelper.enums.TypeSearch;
import com.example.tuananh.databasehelper.model.ItemSearch;

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

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
   private SearchRecyclerAdapter mSearchRecyclerAdapter;
   private List<ItemSearch> mItemSearchList = new ArrayList<>();
   private TextView mTextViewTitleSearch;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       initViews();
       loadData(TypeSearch.DEGREES);
   }

   private void loadData(TypeSearch typeSearch) {
       mItemSearchList.clear();
       List<ItemSearch> itemSearchList =
           DatabaseManager.getInstance(this).getItemSearch(typeSearch);
       if (itemSearchList != null) {
           mItemSearchList.addAll(itemSearchList);
       }
       mSearchRecyclerAdapter.notifyDataSetChanged();
   }

   private void initViews() {
       mTextViewTitleSearch = (TextView) findViewById(R.id.text_title_search);
       mSearchRecyclerAdapter = new SearchRecyclerAdapter(this, mItemSearchList);
       RecyclerView recyclerViewSearch = (RecyclerView) findViewById(R.id.recycler_view_search);
       recyclerViewSearch.setAdapter(mSearchRecyclerAdapter);
       recyclerViewSearch.setLayoutManager(new LinearLayoutManager(this));
       mTextViewTitleSearch.setText(R.string.text_test_title_degree);
       findViewById(R.id.button_next).setOnClickListener(this);
   }

   @Override
   public void onClick(View view) {
       switch (view.getId()) {
           case R.id.button_next:
               break;
       }
   }
}

8. Một số hình ảnh minh họa

8.1. Full

Ảnh 1

8.1. Điều kiện orderBy

Với queryHelper.addOrderBy(valueTableName + "." + FIELD_EN_VALUE, true);

Ảnh 2

8.2. Điều kiện limit

 Với queryHelper.addLimit("4");

Ảnh 3

8.3. Điều kiện limit + offset

  Với  queryHelper.addLimit("10");  queryHelper.addOffset("3");

Ảnh 4 Full code : Link phần 1