Sergei Mikhailovskii
Sergei Mikhailovskii

Reputation: 2465

Data is added to database but can't be loaded from it. Android

I faced with the following problem: I have an application, which is based on MVP pattern. App should take data from edittext, add it to database and after load this data from database. Here's the code:

Presenter class:

package asus.example.com.mvpexample;

import android.content.ContentValues;
import android.util.Log;

import java.util.List;
import java.util.concurrent.ExecutionException;

public class Presenter {

    private MainActivity view;
    private Model model;

    public Presenter(Model model, MainActivity mainActivity){
        this.model = model;
        this.view = mainActivity;
    }

    public void add(){
        Data data = view.getDataFromEdit();
        ContentValues cv = new ContentValues(1);
        cv.put("INFO", data.getDataString());
        Log.i(getClass().getSimpleName(), "Added in presenter");
        model.addValues(cv);
    }

    public List<Data> loadValues(){
        try {
            Log.i(getClass().getSimpleName(), "List returned in Presenter");
            return model.loadValues();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

}

Model class:

package asus.example.com.mvpexample;

import android.content.ContentValues;
import android.database.Cursor;
import android.os.AsyncTask;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;


public class Model {

    private DBHelper dbHelper;

    public Model(DBHelper dbHelper){
        this.dbHelper = dbHelper;
    }

    public void addValues(ContentValues contentValues){
        AddData addData = new AddData();
        addData.execute(contentValues);
        Log.i(getClass().getSimpleName(), "Values added in model");
    }

    public List<Data> loadValues() throws ExecutionException, InterruptedException {
        LoadData loadData = new LoadData();
        List<Data> list = loadData.execute().get();
        Log.i(getClass().getSimpleName(), "List loaded in model");
        return list;
    }



    private class AddData extends AsyncTask<ContentValues, Void, Void> {

        @Override
        protected Void doInBackground(ContentValues... contentValues) {
            ContentValues cv = contentValues[0];
            dbHelper.getWritableDatabase().insert("DATA_TABLE", null, cv);
            return null;
        }
    }

    private class LoadData extends AsyncTask<Void, Void, List<Data>>{

        @Override
        protected List<Data> doInBackground(Void... voids) {
            List<Data> dataList = new ArrayList<>();
            Cursor cursor = dbHelper.getReadableDatabase().query("DATA_TABLE", null,
                    null, null, null, null, null);
            Data data = new Data();
            while (cursor.moveToNext()){
                data.setId(cursor.getInt(cursor.getColumnIndex("ID")));
                data.setDataString(cursor.getString(cursor.getColumnIndex("INFO")));
            }

            return dataList;
        }
    }
}

Database class:

package asus.example.com.mvpexample;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {

    public DBHelper(Context context) {
        super(context, "MyDatabase", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE DATA_TABLE ("+
                "ID INTEGER PRIMARY KEY AUTOINCREMENT,"+
                "INFO TEXT"+
                ");"
        );
    }

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

    }
}

When I checked it in debugger, data is added to database, as data.getDataString() in Presenter's method add isn't null and contains a value. But method public List<Data> loadValues() throws ExecutionException, InterruptedException in Model class returns null and I don't understand why. So, what's the matter and how can I solve this problem?

Upvotes: 0

Views: 29

Answers (1)

Vikas Malhotra
Vikas Malhotra

Reputation: 131

There are two mistakes in this code,

  1. In your doInBackground method, you forgot to add data to the dataList.
  2. You should create a new object of Data in the while (cursor.moveToNext()) loop.

So it should be like this:

while (cursor.moveToNext()) {
  Data data = new Data();
  data.setId(cursor.getInt(cursor.getColumnIndex("ID")));
  data.setDataString(cursor.getString(cursor.getColumnIndex("INFO")));
  dataList.add(data);
}

Hope it helps!

Upvotes: 1

Related Questions