Configurações básicas

Inicialmente deve ser criado um projeto no Firebase console e depois adicioná-los em seu projeto no Android Studio. A documentação oficial explica esse processo passo a passo. Dessa forma, acesse: https://firebase.google.com/docs/android/setup?hl=pt-br.

Conexão com o banco

Após as configurações básicas, é necessário obter uma referância do banco de dados, isto vai depender do banco que será utilizado, pois o Firebase , possui vários banco: como o Firestore e o Realtime Database.

FirebaseFirestore db = db = FirebaseFirestore.getInstance();

DatabaseReference refBd = FirebaseDatabase.getInstance().getReference();

Salvar / listar dados no banco

Para salvar os dados no Firestore, você precisa criar uma coleção e os dados serão salvos na estrutura de um Map.

db.collection("minha lista")
             .add(lista.toMap())
             .addOnSuccessListener(documentReference -> {
                 Toast.makeText(this, "Sucesso", Toast.LENGTH_LONG).show();
                 obterDados();
             })
             .addOnFailureListener(e -> {
                 Log.w("Cadastro", "Erro", e);
             });

Para obter os dados do Firestore basta acessar QueryDocumentSnapshot document : task.getResult() e através do document acessar os campos dos objetos mapeados, por exemplo document.getString("nome do campo"), no caso de inteiro document.getLong("nome do campo"). Veja o código completo abaixo:

db.collection("minha lista")
               .get()
               .addOnCompleteListener(task -> {
                   if (task.isSuccessful()) {
                       List<String> lista = new ArrayList<>();
                       for (QueryDocumentSnapshot document : task.getResult()) {
                           String nome = document.getString("nome do campo");
                           int idade = Objects.requireNonNull(document.getLong("nome do campo")).intValue();
                           Log.d("Dado",document.getId() + " => " + document.getData());
                       }
                   } else {
                       Log.d("Erro", "Erro ao obter dados: ", task.getException());
                   }
               });

Para mais detalhes sobre leitura e gravação de dados no Realtime Database acesse a documentação oficial: https://firebase.google.com/docs/database/android/read-and-write?hl=pt-br#java_2.

Para mais detalhes sobre o Firestore acesse a documentação oficial: https://firebase.google.com/docs/firestore/quickstart?hl=pt-br.

Exemplo prático:

  • activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
        <Button
            android:id="@+id/buttonConectar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="40dp"
            android:text="Conectar"
            />
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerUsuarios"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />
    </LinearLayout>
  • item_lista.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="12dp">
        <TextView
            android:id="@+id/txtNome"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Nome"
            android:textSize="16sp"
            android:textStyle="bold"/>
        <TextView
            android:id="@+id/txtEmail"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Email"/>
    </LinearLayout>
  • MainActivity.java

    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.lifecycle.Observer;
    import androidx.lifecycle.ViewModelProvider;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;
    import java.util.ArrayList;
    import java.util.List;
    public class MainActivity extends AppCompatActivity {
        private UsuarioViewModel viewModel;
        private UsuarioAdapter adapter;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            RecyclerView recyclerView = findViewById(R.id.recyclerUsuarios);
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
            adapter = new UsuarioAdapter(new ArrayList<>());
            recyclerView.setAdapter(adapter);
            viewModel = new ViewModelProvider(this)
                    .get(UsuarioViewModel.class);
            viewModel.getUsuarios().observe(this,
                    new Observer<List<Usuario>>() {
                @Override
                public void onChanged(List<Usuario> usuarios) {
                    adapter = new UsuarioAdapter(usuarios);
                    recyclerView.setAdapter(adapter);
                }
            });
            viewModel.getErro().observe(this, new Observer<String>() {
                @Override
                public void onChanged(String error) {
                    Toast.makeText(
                            MainActivity.this,
                            error,
                            Toast.LENGTH_SHORT
                    ).show();
                }
            });
            Button buttonConectar = findViewById(R.id.buttonConectar);
            buttonConectar.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Usuario usuario = new Usuario(null, "Ana",
                            "email@email.com");
                    viewModel.addUsuario(usuario);
                }
            });
        }
    }//
  • Usuario.java

    public class Usuario {
        private String id;
        private String nome;
        private String email;
        public Usuario() {
        }
        public Usuario(String id, String nome, String email) {
            this.id = id;
            this.nome = nome;
            this.email = email;
        }
        public String getId() { return id; }
        public String getNome() { return nome; }
        public String getEmail() { return email; }
        public void setId(String id) { this.id = id; }
        public void setNome(String nome) { this.nome = nome; }
        public void setEmail(String email) { this.email = email; }
    }
  • UsuarioAdapter.java

    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    import androidx.annotation.NonNull;
    import androidx.recyclerview.widget.RecyclerView;
    import java.util.List;
    public class UsuarioAdapter extends
            RecyclerView.Adapter<UsuarioAdapter.UserViewHolder> {
        private List<Usuario> usuarios;
        public UsuarioAdapter(List<Usuario> usuarios) {
            this.usuarios = usuarios;
        }
        @NonNull
        @Override
        public UserViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                                                 int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.item_lista, parent,
                            false);
            return new UserViewHolder(view);
        }
        @Override
        public void onBindViewHolder(@NonNull UserViewHolder holder, int position) {
            Usuario usuario = usuarios.get(position);
            holder.txtNome.setText(usuario.getNome());
            holder.txtEmail.setText(usuario.getEmail());
        }
        @Override
        public int getItemCount() {
            return usuarios.size();
        }
        static class UserViewHolder extends RecyclerView.ViewHolder {
            TextView txtNome, txtEmail;
            public UserViewHolder(@NonNull View itemView) {
                super(itemView);
                txtNome = itemView.findViewById(R.id.txtNome);
                txtEmail = itemView.findViewById(R.id.txtEmail);
            }
        }
    }
  • UsuarioRepository.java

    import androidx.annotation.NonNull;
    import com.google.firebase.database.DataSnapshot;
    import com.google.firebase.database.DatabaseError;
    import com.google.firebase.database.DatabaseReference;
    import com.google.firebase.database.FirebaseDatabase;
    import com.google.firebase.database.ValueEventListener;
    import java.util.ArrayList;
    import java.util.List;
    public class UsuarioRepository {
        private DatabaseReference firebase;
        public UsuarioRepository() {
            firebase = FirebaseDatabase
                    .getInstance()
                    .getReference("usuarios");
        }
        public void addUsuario(Usuario usuario) {
            String id = firebase.push().getKey();
            usuario.setId(id);
            firebase.child(id).setValue(usuario);
        }
        public void obterUsuarios(UsuariosListener listener) {
            firebase.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    List<Usuario> list = new ArrayList<>();
                    for (DataSnapshot child : snapshot.getChildren()) {
                        Usuario usuario = child.getValue(Usuario.class);
                        if (usuario != null) {
                            list.add(usuario);
                        }
                    }
                    listener.onSuccess(list);
                }
                @Override
                public void onCancelled(@NonNull DatabaseError error) {
                    listener.onError(error.getMessage());
                }
            });
        }
        public void updateUser(Usuario usuario) {
            firebase.child(usuario.getId()).setValue(usuario);
        }
        public void deleteUser(String id) {
            firebase.child(id).removeValue();
        }
        public interface UsuariosListener {
            void onSuccess(List<Usuario> usuarios);
            void onError(String error);
        }
    }
  • UsuarioViewModel.java

    import androidx.lifecycle.LiveData;
    import androidx.lifecycle.MutableLiveData;
    import androidx.lifecycle.ViewModel;
    import java.util.List;
    public class UsuarioViewModel extends ViewModel {
        private UsuarioRepository repository = new UsuarioRepository();
        private MutableLiveData<List<Usuario>> usuariosLiveData = new MutableLiveData<>();
        private MutableLiveData<String> erroLiveData = new MutableLiveData<>();
        public UsuarioViewModel() {
            obterUsuarios();
        }
        public LiveData<List<Usuario>> getUsuarios() {
            return usuariosLiveData;
        }
        public LiveData<String> getErro() {
            return erroLiveData;
        }
        public void obterUsuarios() {
            repository.obterUsuarios(new UsuarioRepository.UsuariosListener() {
                @Override
                public void onSuccess(List<Usuario> usuarios) {
                    usuariosLiveData.setValue(usuarios);
                }
                @Override
                public void onError(String error) {
                    erroLiveData.setValue(error);
                }
            });
        }
        public void addUsuario(Usuario usuario) {
            repository.addUsuario(usuario);
        }
        public void deleteUsuario(String id) {
            repository.deleteUser(id);
        }
        public void updateUsuario(Usuario usuario) {
            repository.updateUser(usuario);
        }
    }