Данные добавляются в базу данных, но не могут быть загружены из нее. Android - PullRequest
0 голосов
/ 09 мая 2019

Я столкнулся со следующей проблемой: у меня есть приложение, основанное на шаблоне MVP.Приложение должно взять данные из edittext, добавить их в базу данных и после загрузки этих данных из базы данных.Вот код:

Класс докладчика:

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;
    }

}

Класс модели:

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;
        }
    }
}

Класс базы данных:

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) {

    }
}

Когда я проверял этов отладчике данные добавляются в базу данных, так как data.getDataString() в методе Presenter add не равен нулю и содержит значение.Но метод public List<Data> loadValues() throws ExecutionException, InterruptedException в классе Model возвращает ноль, и я не понимаю, почему.Итак, в чем дело и как я могу решить эту проблему?

1 Ответ

1 голос
/ 09 мая 2019

В этом коде есть две ошибки:

  1. В вашем методе doInBackground вы забыли добавить данные в dataList.
  2. Вы должны создать новый объект Data вЦикл while (cursor.moveToNext ()).

Так и должно быть:

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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...