11.12: Un “blog” personale per Android sfruttando Firebase: il passaggio all’activity di aggiunta post

Condividi su:

Con lo scorso articolo abbiamo implementato gran parte dell’adapter della RecyclerView che sfrutteremo per visualizzare i post salvati, oltre alla model class che rappresenta proprio questi post. Adesso tocca soffermarci sulla gestione del database real-time fornito da Firebase, così da poterlo popolare ed esplorare.





Per prima cosa adeguiamo il nostro progetto richiamando nuovamente l’assistente di Firebase “Tools”->”Firebase” e recandoci nella sezione dedicata per avere la guida passo passo. Ovviamente sfrutteremo questa per soddisfare automaticamente le dipendenze necessarie, poiché il progetto l’abbiamo già collegato a Firebase per gestirne l’autenticazione.
Aggiunte le dipendenze (col pulsante presente nel secondo punto della guida dell’assistente) possiamo proseguire.

Il passaggio verso l’activity di aggiunta post

Per le modifiche effettuate all’interno di MainActivity, quando l’utente effettuerà il login o risulterà già loggato, verrà reindirizzato verso PostListActivity. Quindi è da questa schermata che l’utente dovrà essere in grado di aggiungere un nuovo post, quindi adeguiamola:

public class PostListActivity extends AppCompatActivity {
    private FirebaseDatabase mDB;
    private DatabaseReference mDBRef;
    private FirebaseUser mUser;
    private FirebaseAuth mAuth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_post_list);

        //Recuperiamo l'istanza di autenticazione e l'utente coorente
        mAuth = FirebaseAuth.getInstance();
        mUser = mAuth.getCurrentUser();
        
        /* 
         * Recuperiamo l'istanza del database,
         * il riferimento alla posizione figlia in cui vogliamo memorizzare dati e
         * manteniamo il database sincronizzato tra dispositivo e cloud
         */
        mDB = FirebaseDatabase.getInstance();
        mDBRef = mDB.getReference().child("Blog");
        mDBRef.keepSynced(true);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //Creiamo il menù effettuando l'inflate del layout apposito
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        //Gestiamo la selezione degli item del menù
        switch (item.getItemId()){
            case R.id.action_add:
                /* 
                 * Quando l'utente sceglie l'item per aggiungere un nuovo post
                 * lo direzioniamo verso l'activity appropriata
                 */
                if (mUser != null && mAuth != null){
                    startActivity(new Intent(PostListActivity.this, AddPostActivity.class ));
                    finish();
                }
                break;
            case R.id.action_signout:
                /*
                 * Quando l'utente sceglie l'item per effettuare il logout
                 * eseguiamo l'operazione e ritorniamo all'activity di login e registrazione
                 */
                if (mAuth != null){
                    mAuth.signOut();
                    startActivity(new Intent(PostListActivity.this, MainActivity.class ));
                    finish();
                }
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

Al momento continuiamo a tralasciare tutta la parte relativa alla gestione della RecyclerView poiché non abbiamo ancora il dataset definito, quindi ci soffermiamo sul codice necessario a rendere possibile l’aggiunta di un nuovo post.

Abbiamo già un’activity dedicata a ciò: AddPostActivity. L’utente dovrà quindi essere indirizzato verso questa nel momento in cui vorrà aggiungere un post. Abbiamo anche un menù apposito creato ad hoc, quindi non facciamo altro che richiamare i metodi necessari alla creazione del menù e alla gestione della selezione dell’item del menù. Nel primo facciamo l’inflate del layout apposito, nel secondo gestiamo la selezione sui due item sfruttando uno switch.

Cliccando sul pulsante di aggiunta post avviamo AddPostActivity con un intent, cliccando sul pulsante di logout avviamo il metodo apposito e ritorniamo alla schermata di login: MainActivity.

Ovviamente per poter effettuare tali operazioni dobbiamo assicurarci di avere l’istanza di autenticazione e quella dell’utente corrente, quindi aggiungiamo anche tutti i field necessari e recuperiamo le relative istanze da Firebase. Nel momento in cui l’utente vuole aggiungere un nuovo post verifichiamo l’esistenza dell’istanza di autenticazione e quella dell’utente; nel momento in cui l’utente vuole effettuare il logout verifichiamo quella di autenticazione.

Al momento non ne abbiamo ancora avuto bisogno, ma come vedete è stata recuperata anche l’istanza del database e il riferimento della posizione in cui troveremo e scriveremo i dati. Qui abbiamo delle particolarità.
La prima è che nel recuperare il riferimento alla posizione del database richiamiamo in cascata il metodo “child()”, indicando a lui tramite il parametro il nome della posizione che ci serve. In questo modo avremo una sorta di database, figlio del principale, in cui poter gestire tutti i dati relativi al blog. Sfruttando i database figli ne possiamo gestire diversi parallelamente all’interno dello stesso database senza che gli uni interferiscano con gli altri, poiché salvati in nodi diversi.
La seconda consiste nel mantenere sincronizzato il database anche in assenza di un listener apposito, tutto grazie al metodo “keepSynced()” col parametro settato su true. Questo mantiene la consistenza tra i dati nella cache del dispositivo e quelli nel cloud.




Possiamo fermarci qui, nel prossimo articolo inizieremo ad occuparci dell’activity dedicata all’invio di post, introducendo qualcosa di nuovo.

Condividi su:

label, ,

About the author