Reputation: 2465
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
Reputation: 131
There are two mistakes in this code,
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