Tutorial: Come creare una Todo App in Java e SQLite | PT. 2

Tutorial: Come creare una Todo App in Java e SQLite | PT. 2

Introduciamo la classe Todo ed eliminiamo correttamente le task

Nella Parte 1 abbiamo creato una semplice Todo App utilizzando:

  • SQLite per salvare i dati
  • ListView per mostrarli
  • ArrayAdapter per collegare dati e interfaccia

In quella versione, però, stavamo lavorando solo con ArrayList<String>.

Questo approccio funziona, ma ha un limite importante:

Non abbiamo accesso all’ID della task salvata nel database.

Senza ID non possiamo gestire correttamente operazioni come eliminazione o modifica.

In questa seconda parte miglioreremo la struttura dell’app:

  • Creiamo una classe Todo
  • Modifichiamo il DatabaseHelper
  • Aggiorniamo la MainActivity
  • Implementiamo l’eliminazione corretta tramite ID

Creiamo la classe Todo

Creiamo un nuovo file: Todo

package com.samuelefilincieri.todoapp;

public class Todo {

    private int id;
    private String task;

    public Todo(int id, String task) {
        this.id = id;
        this.task = task;
    }

    public int getId() {
        return id;
    }

    public String getTask() {
        return task;
    }

    @Override
    public String toString() {
        return task;
    }
}

Perché override di toString()?

Perché la ListView usa automaticamente toString() per mostrare l’oggetto.

In questo modo possiamo usare ArrayAdapter<Todo> senza modificare il layout.

Aggiorniamo il DatabaseHelper

Ora modifichiamo DatabaseHelper per lavorare con oggetti Todo invece che con String.

Metodo getAllTasks aggiornato

public ArrayList<Todo> getAllTasks() {

    ArrayList<Todo> list = new ArrayList<>();
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);

    if (cursor.moveToFirst()) {
        do {
            int id = cursor.getInt(0);
            String task = cursor.getString(1);

            list.add(new Todo(id, task));

        } while (cursor.moveToNext());
    }

    cursor.close();
    db.close();
    return list;
}

Metodo deleteTask tramite ID

public void deleteTask(int id) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(TABLE_NAME, "id=?", new String[]{String.valueOf(id)});
    db.close();
}

Adesso l’eliminazione è precisa e sicura.

Aggiorniamo la MainActivity

Ora modifichiamo la MainActivity per usare ArrayList<Todo>.

Variabili aggiornate

ArrayAdapter<Todo> adapter;
ArrayList<Todo> todoList;

onCreate aggiornato

db = new DatabaseHelper(this);
todoList = db.getAllTasks();

adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, todoList);
listViewTodo.setAdapter(adapter);

Pulsante Aggiungi aggiornato

Modifichiamo l’evento del bottone:

buttonAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

String taskText = editTextTodo.getText().toString();

if (!taskText.isEmpty()) {

db.addTask(taskText);

// Ricarichiamo dal database per ottenere anche l'ID
todoList.clear();
todoList.addAll(db.getAllTasks());

adapter.notifyDataSetChanged();
editTextTodo.setText("");
}
}
});

Eliminare una Task con Long Click

Ora aggiungiamo l’eliminazione tramite pressione prolungata:

listViewTodo.setOnItemLongClickListener((parent, view, position, id) -> {

    Todo selectedTask = todoList.get(position);

    db.deleteTask(selectedTask.getId());

    todoList.remove(position);
    adapter.notifyDataSetChanged();

    Toast.makeText(MainActivity.this,
            "Task eliminata",
            Toast.LENGTH_SHORT).show();

    return true;
});

Cosa Succede Ora?

Quando tieni premuto su una task:

  • Recuperiamo l’oggetto Todo
  • Otteniamo il suo ID
  • Lo eliminiamo dal database
  • Lo rimuoviamo dalla lista
  • Aggiorniamo l’interfaccia

Il tutto in modo corretto e professionale.

Risultato Finale

Rispetto alla Parte 1 abbiamo:

  • Struttura dati più professionale
  • Gestione corretta dell’ID
  • Eliminazione precisa dal database
  • Codice più scalabile

Ora la nostra Todo App è strutturata correttamente e pronta per evolvere.

Conclusione

Nel prossimo articolo potremo aggiungere:

  • Modifica di una task
  • Task completate
  • RecyclerView
  • Material Design

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Share via
Copy link