9.4: Un gestore contatti per Android sfruttando i database: i preparativi

Condividi su:

Nel precedente articolo abbiamo illustrato per sommi capi e in linea teorica i database. L’argomento è vastissimo e per illustrarlo completamente probabilmente non basteranno 10 o 20 articoli. A noi interessa sapere come sfruttare dei database in Android, poiché è una struttura di dati che può tornare utile in svariati contesti, quindi non ci soffermeremo più di tanto sulla parte teorica, che eventualmente lascio a voi, ma andiamo subito alla pratica.





Per ritornare un po’ all’esempio visto precedentemente, creeremo un’app per la gestione dei contatti. Questi saranno ovviamente memorizzati in un database e come detto sarà di tipo relazionale, quindi formato logicamente da tabelle.

Essendo un progetto abbastanza complesso, ci rifaremo di nuovo al pattern MVC (Model View Controller), così da avere una struttura di questo organizzata e chiara.

L’app non sarà completa, poiché a noi interessa solo capire come sfruttare i database. In questa fase non ci interessa dell’interfaccia, quindi tutte le prove le faremo servendoci di logcat.

I package e le classi da creare

Volendo lasciare il package principale al solo codice inerente le activity, andremo a creare altri package all’interno della cartella Java. Al momento ce ne bastano tre: “Data”, “Model” e “Util”.
Nel primo andremo ad inserire le classi per la gestione del database; nel secondo le classi per il modello di dati utilizzato; nel terzo classi di utilità varia.
Se non avete capito di cosa abbiamo parlato in questi ultimi paragrafi, andatevi a rivedere gli articoli dedicati alle RecyclerView, poiché anche lì abbiamo strutturato il progetto servendoci del pattern MVC.

In questo articolo ci dedicheremo alle classi più facili: “Contact”, inserita nel package “Model” e “Util”, che intuitivamente va all’interno del package “Util”. Col prossimo articolo inizieremo a creare la classe “DatabaseHandler”, che inseriremo all’interno del package “Data”.

La classe Contact

Iniziamo con “Contact”:

package Model;

/**
 * Created by DeCodExLab on 10/10/17.
 */

public class Contact {
    private int id;
    private String name;
    private String phoneNumber;

    public Contact() {
    }

    public Contact(int id, String name, String phoneNumber) {
        this.id = id;
        this.name = name;
        this.phoneNumber = phoneNumber;
    }

    public Contact(String name, String phoneNumber) {
        this.name = name;
        this.phoneNumber = phoneNumber;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}

Ogni contatto sarà formato da tre campi (attributi nel mondo dei database): uno per l’identificativo, il secondo per il nominativo e l’ultimo per il numero di telefono.

Definiti i field, non resta da fare altro che implementare tutti i metodi necessari per ottenere un perfetto incapsulamento, così come vuole il paradigma orientato agli oggetti. Per prima cosa implementiamo il costruttore, o meglio i costruttori, sfruttando l’overloading dei metodi e cambiando la firma di ognuno di questi, cioè il tipo e il numero di parametri.

Potrebbero servirci tutti e tre, quindi semplicemente li implementiamo. Quando ci serviranno richiameremo quello più opportuno, affidandoci alla tecnica del polimorfismo (siamo pur sempre nel campo della OOP).

Finito coi costruttori, implementiamo tutti i getter e setter necessari ad accedere ai vari field, che essendo privati, hanno bisogno di metodi per essere letti e scritti anche dall’esterno.

Fin qui nulla di nuovo, abbiamo semplicemente descritto il modello di dati che andremo ad utilizzare e applicato i principi della programmazione orientata agli oggetti.

Ovviamente tutto quel codice non va scritto a mano, essendo sostanzialmente codice standard, ormai saprete che Android Studio permette di implementare il tutto automaticamente.

La classe Util

Possiamo passare alla nostra classe di utilità varie. Al momento ci serve solo per descrivere il database e la tabella che utilizzeremo. Il codice di “Util” è quindi:

package Util;

/**
 * Created by DeCodExLab on 10/10/17.
 */

public class Util {

    //Database
    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "contactsDB";
    public static final String DATABASE_TABLE_NAME = "contacts";

    //Contacs table columns name
    public static final String KEY_ID = "id";
    public static final String KEY_NAME = "name";
    public static final String KEY_PHONE_NUMBER = "phone_number";
}

Semplicemente abbiamo definito una serie di costanti pubbliche e statiche, quindi utilizzabili ovunque e senza istanziare alcun oggetto. È una classe di utilità, quindi come tale ci permetterà di recuperare le informazioni appena inserite lì dove ne avremo bisogno. Necessiteremo di una versione del database, del suo nome e di quello delle tabelle (in questo caso una sola). Avremo ovviamente bisogno del nome dei vari attributi, ovvero dei nomi delle colonne della tabella, quindi abbiamo inserito anche questi.

Piuttosto che ricordare questi dettagli, al bisogno utilizzeremo, ad esempio, “Util.DATABASE_NAME”. Tutto questo semplicemente per semplificarci la vita nelle fasi successive e ridurre al minimo gli errori.



Con questo articolo abbiamo terminato. Nulla di complesso, abbiamo semplicemente implementato ciò di cui ci serviremo. Nel prossimo articolo inizieremo a dedicarci alla classe “DatabaseHandler”.

Condividi su:

label, ,

About the author