Search code examples
androidandroid-sqliteandroid-recyclerview

Display SQLite data in RecyclerView


I search a lot, but I didn't find any step-by-step guides on how to display SQLite data in RecyclerView. Can anyone explain to me how can I do this?

My DataBaseAdapter :

public class DataBaseAdapter {

DataBaseHelper helper;

public DataBaseAdapter(Context context) {
    helper = new DataBaseHelper(context);
    }

public long insertData(String name, String card, String code) {

    SQLiteDatabase db = helper.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(DataBaseHelper.NAME, name);
    contentValues.put(DataBaseHelper.CARD, card);
    contentValues.put(DataBaseHelper.CODE, code);
    long id = db.insert(DataBaseHelper.TABLE_NAME, null, contentValues);
    return id;
}

public String getData(String name){
    //select _id,Name,Card,Code
    SQLiteDatabase db = helper.getWritableDatabase();
    String[] columns = {DataBaseHelper.NAME, DataBaseHelper.CARD, DataBaseHelper.CODE};
    Cursor cursor = db.query(DataBaseHelper.TABLE_NAME, columns,DataBaseHelper.NAME+" = '"+name+"'", null, null, null, null);
    StringBuffer buffer = new StringBuffer();
    while (cursor.moveToNext()) {
        int index2 = cursor.getColumnIndex(DataBaseHelper.NAME);
        int index3 = cursor.getColumnIndex(DataBaseHelper.CARD);
        int index4 = cursor.getColumnIndex(DataBaseHelper.CODE);

        String personName = cursor.getString(index2);
        String card = cursor.getString(index3);
        String code = cursor.getString(index4);
        buffer.append(name + " " + card + " " + code + "\n");

    }
    return buffer.toString();
}

public String getAllData() {
    //select _id,Name,Card,Code
    SQLiteDatabase db = helper.getWritableDatabase();
    String[] columns = {DataBaseHelper.UID, DataBaseHelper.NAME, DataBaseHelper.CARD, DataBaseHelper.CODE};
    Cursor cursor = db.query(DataBaseHelper.TABLE_NAME, columns, null, null, null, null, null);
    StringBuffer buffer = new StringBuffer();
    while (cursor.moveToNext()) {
        int index1 = cursor.getColumnIndex(DataBaseHelper.UID);
        int index2 = cursor.getColumnIndex(DataBaseHelper.NAME);
        int index3 = cursor.getColumnIndex(DataBaseHelper.CARD);
        int index4 = cursor.getColumnIndex(DataBaseHelper.CODE);

        int cid = cursor.getInt(index1);
        String name = cursor.getString(index2);
        String card = cursor.getString(index3);
        String code = cursor.getString(index4);
        buffer.append(cid + " " + name + " " + card + " " + code + "\n");
    }
    return buffer.toString();

}

static class DataBaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "cardsdatabase";
    private static final String TABLE_NAME = "CARDSTABLE";
    private static final String UID = "_id";
    private static final String NAME = "Name";
    private static final String CARD = "Card";
    private static final String CODE = "Code";
    private static final int DATABASE_VERSION = 1;
    private static final String CREATE_TABLE = "create table "
            + TABLE_NAME + " (" + UID
            + " integer primary key autoincrement, " + NAME
            + " text not null, " + CARD + " ext not null, " + CODE
            + " text not null);";
    private static final String DROP_TABLE = "DROP TABLE IF EXISTS "
            + TABLE_NAME;
    private Context context;

    public DataBaseHelper(Context context) {

        super(context, DataBaseHelper.DATABASE_NAME, null, DataBaseHelper.DATABASE_VERSION);
        this.context = context;
        Toast toast = Toast.makeText(context, "constructor called", Toast.LENGTH_LONG);
        toast.show();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //CREATE TABLE CARDSTABLE(_id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(255));
        try {
            db.execSQL(CREATE_TABLE);
            Toast toast = Toast.makeText(context, "onCreate called", Toast.LENGTH_LONG);
            toast.show();

        } catch (SQLException e) {
            Toast toast = Toast.makeText(context, "" + e, Toast.LENGTH_SHORT);
            toast.show();
        }


    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        try {
            Toast toast = Toast.makeText(context, "onUpgrade called", Toast.LENGTH_LONG);
            toast.show();
            db.execSQL(DROP_TABLE);
            onCreate(db);
        } catch (SQLException e) {
            Toast toast = Toast.makeText(context, "" + e, Toast.LENGTH_LONG);
            toast.show();
        }

    }
}

Your answers will be really helpful for me, thanks

EDIT:

DataBean class :

public class DataBean {
//private variables
int _id;
String _name;
String _card_value;
String _card_code;

// Empty constructor
public DataBean(){

}
// constructor
public DataBean(int id, String name, String _card_value, String _card_code){
    this._id = id;
    this._name = name;
    this._card_value = _card_value;
    this._card_code = _card_code;
}

// constructor
public DataBean(String name, String _card_value, String _card_code){
    this._name = name;
    this._card_value = _card_value;
    this._card_code = _card_code;
}
// getting ID
public int getID(){
    return this._id;
}

// setting id
public void setID(int id){
    this._id = id;
}

// getting name
public String getName(){
    return this._name;
}

// setting name
public void setName(String name){
    this._name = name;
}

// getting CardValue
public String getCardValue(){
    return this._card_value;
}

// setting CardValue
public void setCardValue(String _card_value){
    this._card_value = _card_value;
}
// getting CardCode
public String getCardCode(){
    return this._card_code;
}

// setting CardCode
public void setCardCode(String _card_code){
    this._card_code = _card_code;
}

}

These lines i add to my DataBaseAdapter:

public DataBean getDat(String name){
        DataBean bean=null;
        SQLiteDatabase db=this.getReadableDatabase();
        String[] columns = {DataBaseHelper.NAME, DataBaseHelper.CARD, DataBaseHelper.CODE};
        Cursor cursor = db.query(DataBaseHelper.TABLE_NAME, columns,DataBaseHelper.NAME+" = '"+name+"'", null, null, null, null);
        if (cursor.moveToFirst()) {
            int index = cursor.getColumnIndex(DataBaseHelper.UID);
            int index2 = cursor.getColumnIndex(DataBaseHelper.NAME);
            int index3 = cursor.getColumnIndex(DataBaseHelper.CARD);
            int index4 = cursor.getColumnIndex(DataBaseHelper.CODE);
            int id = cursor.getInt(index);
            String personName = cursor.getString(index2);
            String card = cursor.getString(index3);
            String code = cursor.getString(index4);
            bean = new DataBean(id, name, card, code);
        }
        return bean;
    }
    public List<DataBean> gelAllDat(){
        List<DataBean> list = new ArrayList<>();
        SQLiteDatabase db=this.getReadableDatabase();
        String[] columns = {DataBaseHelper.NAME, DataBaseHelper.CARD, DataBaseHelper.CODE};
        Cursor cursor = db.query(DataBaseHelper.TABLE_NAME, columns,DataBaseHelper.NAME, null, null, null, null);
        while (cursor.moveToNext()) {
            int index = cursor.getColumnIndex(DataBaseHelper.UID);
            int index2 = cursor.getColumnIndex(DataBaseHelper.NAME);
            int index3 = cursor.getColumnIndex(DataBaseHelper.CARD);
            int index4 = cursor.getColumnIndex(DataBaseHelper.CODE);
            int cid = cursor.getInt(index);
            String name = cursor.getString(index2);
            String card = cursor.getString(index3);
            String code = cursor.getString(index4);
            DataBean bean = new DataBean(cid, name, card, code);
            list.add(bean);
        }
        return list;

    }

And last question? I need to change my insert data in DataBaseAdapter?

EDIT 2:

I added this code to my DataBaseAdapter:

public List<DataBean> getAllCards(){
    List<DataBean> list=new ArrayList<>();
    String query = "SELECT  * FROM " + DataBaseHelper.TABLE_NAME;
    SQLiteDatabase db = helper.getReadableDatabase();
    Cursor cursor = db.rawQuery(query, null);
    while (cursor.moveToNext()) {
        //int index = cursor.getColumnIndex(DataBaseHelper.UID);
        int index2 = cursor.getColumnIndex(DataBaseHelper.NAME);
        int index3 = cursor.getColumnIndex(DataBaseHelper.CARD);
        int index4 = cursor.getColumnIndex(DataBaseHelper.CODE);
        //int cid = cursor.getInt(index);
        String name = cursor.getString(index2);
        String card = cursor.getString(index3);
        String code = cursor.getString(index4);
        DataBean bean = new DataBean(name, card, code);
        list.add(bean);
    }

    return list;

}

public DataBean getData(String name) {
    //select _id,Name,Card,Code
    SQLiteDatabase db = helper.getReadableDatabase();
    String[] columns = {DataBaseHelper.NAME, DataBaseHelper.CARD, DataBaseHelper.CODE};
    DataBean bean=null;
    Cursor cursor = db.query(DataBaseHelper.TABLE_NAME, columns, DataBaseHelper.NAME + " = '" + name + "'", null, null, null, null);
    StringBuffer buffer = new StringBuffer();
    while (cursor.moveToNext()) {
        int index2 = cursor.getColumnIndex(DataBaseHelper.NAME);
        int index3 = cursor.getColumnIndex(DataBaseHelper.CARD);
        int index4 = cursor.getColumnIndex(DataBaseHelper.CODE);

        String personName = cursor.getString(index2);
        String card = cursor.getString(index3);
        String code = cursor.getString(index4);
        //buffer.append(name + " " + card + " " + code + "\n");
        bean = new DataBean( name,card, code);

    }
    return bean;
}

Solution

  • You can start with a Bean to contain and model the information and make it more easy to implement.

    public class DataBean{
        protected int id;
        protected String name;
        protected String card;
        protected String code;
        //Setter, Getters and constructor
        ...
    }
    

    With the DataBean created, you can change the return types of your methods to DataBean or a List and filled inside each method instead of return a String with all the fields.

    public DataBean getData(String name){
        ...
        DataBean bean = null;
        if (cursor.moveToFirst()) {
            int index = cursor.getColumnIndex(DataBaseHelper.UID);
            int index2 = cursor.getColumnIndex(DataBaseHelper.NAME);
            int index3 = cursor.getColumnIndex(DataBaseHelper.CARD);
            int index4 = cursor.getColumnIndex(DataBaseHelper.CODE);
            int id = cursor.getInt(index);
            String personName = cursor.getString(index2);
            String card = cursor.getString(index3);
            String code = cursor.getString(index4);
            bean = new DataBean(id, name, card, code);    
        }
        return bean;
    }
    
    public List<DataBean> getAllData() {
        List<DataBean> list = new ArrayList<>();
        ...
        while (cursor.moveToNext()) {
            int index = cursor.getColumnIndex(DataBaseHelper.UID);
            int index2 = cursor.getColumnIndex(DataBaseHelper.NAME);
            int index3 = cursor.getColumnIndex(DataBaseHelper.CARD);
            int index4 = cursor.getColumnIndex(DataBaseHelper.CODE);
            int cid = cursor.getInt(index);
            String name = cursor.getString(index2);
            String card = cursor.getString(index3);
            String code = cursor.getString(index4);
            DataBean bean = new DataBean(cid, name, card, code);
            list.add(bean);
        }
        return list;
    }
    

    Now when you call your methods you have a DataBean object(s), now you need write your Adapter to show the information in the RecyclerView.

    First need link and setup the RecyclerView in your Activity.

    mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());
    mRecyclerView.setAdapter(new DataBeanAdapter(dbAdapter.getAllData(), R.layout.item));
    

    After you need create the DataBeanAdapter and the ViewHolder.

    public class DataBeanAdapter extends RecyclerView.Adapter<DataBeanAdapter.ViewHolder>{
        private List<DataBean> items;
        private int itemLayout;
    
        public DataBeanAdapter(List<DataBean> items, int itemLayout){
            this.items = items;
            this.itemLayout = itemLayout;
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View v = LayoutInflater.from(parent.getContext()).inflate(itemLayout, parent, false);
            return new ViewHolder(v);
        }
    
        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            DataBean item = items.get(position);
            holder.name.setText(item.getName());
            holder.card.setText(item.getCard());
            //All the thing you gonna show in the item
        }
    
        @Override
        public int getItemCount() {
            return items.size();
        }
    
        public static class ViewHolder extends RecyclerView.ViewHolder {
            public TextView name;
            public TextView card;
    
            public ViewHolder(View itemView) {
                super(itemView);
                name = (TextView) itemView.findViewById(R.id.name);
                card = (TextView) itemView.findViewById(R.id.card);
            }
        }
    }
    

    The id's, layout and the attributes of the ViewHolder depending who you gonna show per item in the RecyclerView.