Upload
bruno-de-lima-e-silva
View
1.670
Download
2
Embed Size (px)
Citation preview
Android +
Firebase
Bruno de Lima e Silva
google.com/+BrunoDeLimaS
Gamer Pós-graduado Parto Humanizado Crowdmobi TraktoCoding Dojo
# O que é Firebase?
● Banco de Dados Real-time● Autenticação● Desenvolvimento rápido● Foco no usuário● Bibliotecas para várias plataformas
# Como o Firebase funciona?
●Uma ávore JSON● Sem registros● Novo objeto = Novo campo em um JSON● Valores monitorados● Por que “monitorar” um valor?
# Intro Android
● Estrutura do projeto● Layout e Widgets● Java, Activity, Fragment● Resouces Qualifiers (orientation, locale, screenSize)
# What do we need
● Git● JDK● Android SDK● Android Studio● GenyMotion*
Time to hit “next” *Emulador do android
Firebase
## Biblioteca
● Com o gradle é muito simles● Adicione essa dependência
● Clique em Gradle Sync
dependencies { compile 'com.firebase:firebase-client-android:2.3.1'}
## Biblioteca
● Em alguns casos, adicione
android { packagingOptions { exclude 'META-INF/LICENSE' exclude 'META-INF/LICENSE-FIREBASE.txt' exclude 'META-INF/NOTICE' }}
## Permissões
● Internet
Só isso mesmo
<uses-permission android:name="android.permission.INTERNET" />
## Inicialização
● O firebase precisa ser iniciado com um context● Iniciar na classe Application● Pode ser na activity, se você só tiver uma.● Deve acontecer antes de qualquer operação com o
firebase.
## Inicialização
Seu código deve ficar mais ou menos assim.
public class Application extends android.app.Application {
@Override public void onCreate() { super.onCreate(); Firebase.setAndroidContext(this); }}
# Salvando
● Existem várias formas● Cada uma com seu propósito● Cada operação precisa de uma referência
Firebase ref = new Firebase("sua-url-aqui");
## setValue()
● A Mais comum● Escreve ou sobrescreve um valor
Firebase userRef = ref.child("users").child("gdgmaceio");userRef.child("name").setValue("GDG Maceió");userRef.child("birthYear").setValue(2014);
## setValue()
O código anterior criou a seguinte estrutura.
## setValue()
Podemos passar um objeto.
public class User { private int birthYear; private String name; ...}
Firebase userRef = ref.child("users").child("gdgmaceio");User user = new User("GDG Maceió", 2014);userRef.setValue(user);
## setValue()
O código anterior também pode ser substituído por um map.
Firebase userRef = ref.child("users").child("gdgmaceio");Map<String, String> userMap = new HashMap<String, String>();userMap.put("birthYear", "2014");userMap.put("name", "GDG Maceió");userRef.setValue(userMap);
## updateChildren()
● Atualiza apenas os nós alterados● Usar pra editar múltiplos campos de simultaneamente
Firebase userRef = ref.child("users").child("gdgmaceio");Map<String, Object> userMap = new HashMap<String, Object>();nickname.put("name", "GDG Maceió Rocks!");userMap.put("birthYear", "2013");userRef.updateChildren(userMap);
## push()
● Usado para Listas● Gerador de Identificador Único
Firebase chats = ref.child("chats");
Map<String, String> post1 = new HashMap<String, String>();post1.put("author", "brunodles");post1.put("message", "Android Is Awesome");chats.push().setValue(post1);
## push()
● Para adicionar o um segundo post
Map<String, String> post2 = new HashMap<String, String>();post2.put("author", "gdgmaceio");post2.put("message", "Firebase too! \\o/");chats.push().setValue(post2);
## runTransaction()
● Quando usar○Operações concorrentes○Possibilidade de inconsistência de dados
● Implementação diferente
## runTransaction()ref.child("chatCount").runTransaction(new Transaction.Handler() { @Override public Transaction.Result doTransaction(MutableData currentData) { if (currentData.getValue() == null) { currentData.setValue(1); } else { currentData.setValue((Long) currentData.getValue() + 1); }
return Transaction.success(currentData); //we can also abort by calling Transaction.abort() }
@Override public void onComplete(FirebaseError firebaseError, boolean committed, DataSnapshot currentData) { //This method will be called once with the results of the transaction. }});
# Monitorando Dados
● Implementar Interface● Observer● Várias formas de observar
## Eventos
Os eventos são disparados de acordo com alguma ação dentro da referência atual.● Adicionar● Alterar● Remover
### Value
● Monitora todas alterações● Primeira chama é o estado atual● Chamadas seguintes são atualizações● Sempre retorna estrutura interna completa
ref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { }
@Override public void onCancelled(FirebaseError firebaseError) { }});
#### Child Added
● Monitora os filhos● Usado para listas● Chamado uma vez para cada filho
ref.addChildEventListener(new ChildEventListener() {
@Override public void onChildAdded(DataSnapshot snapshot, String previousChildKey) { }
});
#### Child Changed
● Monitora alteração dos Filhos● Usado em conjunto com childAdded● Chamado para alteração dos filhos ou descendentes
ref.addChildEventListener(new ChildEventListener() {
@Override public void onChildChanged(DataSnapshot snapshot, String previousChildKey) { }
});
#### Child Removed
● Monitora remoção dos Filhos● Usado em conjunto com childAdded e childChanged● Recebe uma cópia do filho que foi removido
ref.addChildEventListener(new ChildEventListener() {
@Override public void onChildRemoved(DataSnapshot snapshot) { }
});
## Queries
● Ordenação● Limites
Query query = ref.child("chats").orderByChild("date");
Firedroid
https://github.com/brunodles/Firedroid-gdg
1_ Criar projeto
1_ Criar projeto
1_ Criar projeto
1_ Criar projeto
1_ Criar projeto
2_ Importe o Firebase
dependencies { compile 'com.firebase:firebase-client-android:2.3.1'}
packagingOptions { exclude 'META-INF/LICENSE' exclude 'META-INF/LICENSE-FIREBASE.txt' exclude 'META-INF/NOTICE'}
● Importe usando o gradle
● Adicione para evitar possíveis conflitos
3_ Permissão de Internet
● Adicione no AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
4_ Inicialize o Firebase
● Crie uma nova classe java chamada Application● Faça ela herdar de android.app.Application● Sobrescreva o método onCreate● Inicialize o Firebase● Use essa classe como name da tag Application no
AndroidManifest.xml
4_ Inicialize o Firebasepublic class Application extends android.app.Application { @Override public void onCreate() { super.onCreate(); Firebase.setAndroidContext(this); }}
<application android:name=".Application"
5_ Classe auxiliar
● Essa classe vai ajudar a acessar o Firebase● Pode evoluir pra um Data Access Object
public class FirebaseHelper {
public static Firebase get() { return new Firebase("https://firedroid.firebaseio.com/"); }}É possível colocar essa string em outros arquivos, deixando a compilação mais dinâmica.
6_ Login
● Adicionar ao layout○ Campos de texto
■Email■Password
○ Botões■Sign In
■ Sign UP■ Forgot password
6_ Login
● Associar os campos no fragment● Criar
○Click Listener para os botões○registro de usuário○login de usuário○recuperar senha
● remover menu
Existe uma lib para fazer essas associações de forma mais elegante.
7_ Chat
● Montar tela do chat○ TextView○EditText○Button
● Associar widgets● Iniciar após o Login● Enviar mensagem
7_ Chat
Firebase firebase = FirebaseHelper.get();Firebase messageRef = firebase.child("messages").push();messageRef.child("text").setValue(message.getText().toString());
7_ Chat
● Exibir todas as mensagems no TextView● Usando o Value Event Listener
Depois vamos mudar isso, para um ListView
Iterable<DataSnapshot> children = dataSnapshot.getChildren();StringBuilder builder = new StringBuilder();for (DataSnapshot child : children) { builder.append(child.child("text").getValue()); builder.append("\n");}messages.setText(builder.toString());
8_ Melhorar Login
● Travar tela (Progress dialog)● Logar usuário depois de registrar● Guardar dados de login
9_ Melhorar Chat
● Enviar mensagem direto do teclado● Limpar texto atual● Colocar ListView no Layout● Layout dos itens● Adapter● Mover para última messagem
10_ Melhorar Código
● Organizar classes● Criar Classe Mensagem● Helper para referencia de mensagem● Enviar mensagem usando helper● Extrair Login Preference
11_ Libs
● ButterKnife¹● SnackBar (DesignCompat)²
¹ Remover “findViewById” e “Click Listeners”
compile 'com.jakewharton:butterknife:7.0.1'compile 'com.android.support:design:22.2.1'
² Substituir Toast
Obrigado
+BrunoDeLimaS
Bruno de Lima
@brunodles