7

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;
}
Ololoking
  • 1,577
  • 4
  • 22
  • 37
  • You are leaking `Cursor` objects in most of your methods that use them. Please close the `Cursor` when you are done with it. Beyond that, there is no code in the above listing that would create anything that could be displayed in any `AdapterView` (e.g., `ListView`) or `RecyclerView`. You are going to need to have some data structure that represents a collection of model data (e.g., `ArrayList` of POJOs, `Cursor`). Once you have created that, *then* come back here to inquire about how to put that model data in a `RecyclerView`, so we know what the structure of the model data is. – CommonsWare Feb 03 '15 at 21:56
  • Is it compulsory for you to use SQLite? It has way too much boilerplate code, if it isn't compulsory, check my answer here that covers how to populate RecyclerView from database in just a few lines with Realm http://stackoverflow.com/questions/26517855/using-the-recyclerview-with-a-database/33568015#33568015 – PirateApp Nov 08 '15 at 04:57
  • @PirateApp thanks for responce, ill try it! – Ololoking Nov 10 '15 at 10:10

1 Answers1

10

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.

Sujit Yadav
  • 2,697
  • 1
  • 15
  • 17
f3rn4nd000
  • 434
  • 3
  • 7
  • as i understood correctly where u put dots i need to write this code '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);' – Ololoking Feb 05 '15 at 12:04
  • @ f3rn4nd000 it doesnt work , pls can u help me a bit more. i will edit my aswer and pasr full code – Ololoking Feb 05 '15 at 12:21
  • pls help my because i just didnt understand what to do – Ololoking Feb 05 '15 at 12:27
  • In this link have a tutorial step by step of how achieve it http://antonioleiva.com/recyclerview/ – f3rn4nd000 Feb 05 '15 at 12:31
  • i try your code but i have error , in 'mRecyclerView.setAdapter(new DataBeanAdapter(dbAdapter.getAllData()), R.layout.item);' i have error because need 2nd parameter(int ) after 'getAllData()' – Ololoking Feb 07 '15 at 16:02
  • my last question, now i have nullPointExeption, at recyclerView.setAdapter(new RecycleViewAdapter(dataBaseHelper.getAllCards(),R.layout.custom_row)); pls chech my second edit , i think my fault that i past wrong code in method getAllCards – Ololoking Feb 07 '15 at 16:34
  • Wrap your while loops of the get data methods in if(cursor != null). The cursor it's null when something goes wrong on the query or don't have results to shown. – f3rn4nd000 Feb 07 '15 at 17:04
  • This is going to be slow. – Relm Jan 05 '17 at 05:51
  • How to make the data loading faster using this approach? – makkhay gurung Oct 11 '18 at 03:47