Ошибка OutOfMemory при отображении данных из базы данных SQLiteDatabase - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь отобразить данные, хранящиеся в базе данных SQLite, с помощью метода displayData (). На кнопке есть onClickListener, и всякий раз, когда метод вызывается внутри этого onClickListener, он выполняется отлично. Хотя я хочу, чтобы данные отображались при каждом запуске приложения. Когда я вызываю тот же метод непосредственно в методе onCreate или onStart, я получаю ошибку OutOfMemory при перезапуске приложения. Как я могу вызвать метод всякий раз, когда приложение запускается без этой ошибки?

MainActivity

DatabaseHelper dbHelper;
ListView listView;
EditText taskInput;
Button addButton;
ArrayList<String> taskList;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    taskList = new ArrayList<String>();

        listView = (ListView) findViewById(R.id.listView);
        taskInput = (EditText) findViewById(R.id.taskInput);
        addButton = (Button) findViewById(R.id.addButton);
        dbHelper = new DatabaseHelper(this);

        addButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //put data to Database
                String getInput = taskInput.getText().toString();
                if (taskInput.length() != 0) {
                    putData(getInput);
                    taskInput.setText("");
                    displayData();
                } else {
                    Toast.makeText(MainActivity.this, "You must put something!", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

public void displayData(){

    Cursor data = dbHelper.fetchData();
    ToDoAdapter cursorAdapter = new ToDoAdapter(this, data);
    if(data.getCount() != 0){
        taskList.clear();
        while(data.moveToNext()){
            taskList.add(data.getString(1));
            listView.setAdapter(cursorAdapter);
        }
    }
    else{
        Toast.makeText(this, "Error!", Toast.LENGTH_SHORT).show();
    }
}
public void putData(String newEntry){
    boolean insertData = dbHelper.addData(newEntry);
    if(insertData == true){
        Toast.makeText(this, "Successfully Added Task", Toast.LENGTH_SHORT).show();
    }
    else{
        Toast.makeText(this, "No Data Added", Toast.LENGTH_SHORT).show();
    }
}

1 Ответ

0 голосов
/ 08 января 2019

Вы устанавливаете адаптер для каждой итерации цикла while. Вам необходимо добавлять данные в свой список на каждой итерации, а когда он завершится, установить его для адаптера снаружи во время цикла. Проверьте код ниже

while(data.moveToNext()){
    taskList.add(data.getString(1));

}

listView.setAdapter(cursorAdapter);
...