0

I am trying to abstract data from SQLite database . I'm getting retrieving data correctly but I think there is a problem in the layout.

I have insert two row, but it is showing only one row multiple times.

long id;     

DBAdapter db = new DBAdapter(getActivity());
db.open();
id = db.insertEducationDetail(1, "a", "b", "c", "d");
id = db.insertEducationDetail(1, "1", "1", "1", "1");
Cursor c = db.getAllContact();
if(c.moveToFirst()){
   Display(c);
}
db.close();

Display:

ArrayList<String> _data = null;
  for(int i=0 ; i<cur.getCount(); i++){
    _data = new ArrayList<String>();
    for(int j=0 ; j<cur.getColumnCount(); j++){
    _data.add(cur.getString(j));
   }
}
list.setAdapter(new Educational_Adapter2(getActivity().getApplicationContext(),a));

Query :

public long insertEducationDetail(int id,String title,String degree,
                                                 String duration,String stream){
    ContentValues value = new ContentValues();
    value.put(KEY.ID, id);
    value.put(KEY.TITLE, title);
    value.put(KEY.DEGREE, degree);
    value.put(KEY.DURATION, duration);
    value.put(KEY.STREAM, stream);
    return db.insert(DATABASE_TABLE,null, value);
}

in output it it repeating data 4 times.

output

Iamat8
  • 3,888
  • 9
  • 25
  • 35

4 Answers4

2

First af all, you pass a list which contains only fields for one last entry, because you recreate the list every time. You create an adapter and pass there a list with 8 Strings - thats why it has 8 lines. End for every line you write the same content. You could declare an EducationDetail class, create a list of details and pass it to your adapter. But best of all would be using CursorAdapter

Victoria
  • 198
  • 1
  • 12
0

You are not moving your cursor along the rows in your Display (should be lowercase!) method. So in the outer for loop you should add cur.moveToPosition(i), like:

public void Display(Cursor cur){
    ArrayList<String> a = null;
    for(int i=0 ; i<cur.getCount(); i++){
        a = new ArrayList<String>();
        cur.moveToPosition(i);
        for(int j=0 ; j<cur.getColumnCount(); j++){
            a.add(cur.getString(j));
        }
    }
    list.setAdapter(new Educational_Adapter2(getActivity().getApplicationContext(),a));
}

This is why your cursor is displaying 8 times (should be the number of rows?) the same thing.

In addition, you should modify your adapter this way:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View listing;
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);


    if(convertView == null){
        listing = new View(context);
        listing = inflater.inflate(R.layout.educational_item, null);
    } else {
        listing = convertView;
    }

    title = (TextView) listing.findViewById(R.id.educational_text1);
    degree = (TextView) listing.findViewById(R.id.educational_text2);
    duration= (TextView)listing.findViewById(R.id.educational_text3);
    stream = (TextView)listing.findViewById(R.id.educational_text4);
    institution = (TextView) listing.findViewById(R.id.educational_text5);
    location=(TextView)listing.findViewById(R.id.educational_text6);
    university = (TextView)listing.findViewById(R.id.educational_text7);
    score= (TextView)listing.findViewById(R.id.educational_text8);

    title.setText(a.get(0));
    degree.setText(a.get(1));
    duration.setText(a.get(2));
    stream.setText(a.get(3));
    institution.setText(a.get(4));
    location.setText(a.get(5));
    university.setText(a.get(6));
    score.setText(a.get(7));

    return listing;
}

Note that this kind of adapter is slightly inefficient. To improve performance over large dataset, you might want to read something about the "ViewHolder" design pattern (there are a lot of question on that topic).

natario
  • 24,954
  • 17
  • 88
  • 158
0

You should not call "a = new ArrayList();" inside the loop - thats why you are losing all the data from previous iteration.

Ircover
  • 2,406
  • 2
  • 22
  • 42
0
    public void Display(Cursor cur){
        ArrayList<EducationInformation> a = new ArrayList<EducationInformation>;
    EducationInformation obj = null;
        for(int i=0 ; i<cur.getCount(); i++){
            obj = new EducationInformation();

             ArrayList<String> a = new ArrayList<String>();
            for(int j=0 ; j<cur.getColumnCount(); j++){

                a.add(cur.getString(j));
            }
              obj.setInfo(a);

        }
        list.setAdapter(new Educational_Adapter2(getActivity().getApplicationContext(),obj));


    }

private class EducationInformation{
  private ArrayList<String> info;

//getter setter
}

And update adapter as

@Override
public int getCount() {
    return info.size();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

        ....

        title.setText(a.get(position).get(0));
        degree.setText(a.get(position).get(1));
        duration.setText(a.get(position).get(2));
        stream.setText(a.get(position).get(3));
        institution.setText(a.get(position).get(4));
        location.setText(a.get(position).get(5));
        university.setText(a.get(position).get(6));
        score.setText(a.get(position).get(7));

        ....