37
Banco de Dados no Mobile: Realm e Firebase Ricardo da Silva Ogliari GDG

TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Embed Size (px)

Citation preview

Page 1: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Banco de Dados no Mobile: Realm e

Firebase

Ricardo da Silva OgliariGDG

Page 2: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Um Pouco Sobre Mim● Bacharel em Ciência da Computação;● Especialista em Web - Inovacão e Tecnologia;● MBA: Desenvolvimento de Jogos e Apps Mobile;● Co-autor do Livro: Android do Básico ao Avançado - Ciência Moderna;● Mobile Magazine;● Desenvolvedor Android Bikoo/BovControl;● Professor Especialização Senac e UPF. Professor Graduação UPF;● Mais de 310 publicações;● Fundador Things Hacker Team;● 10 Nomes Open-Hardware 2013 - Revista iMasters;

Page 3: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

SQLite

Page 4: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Introdução● Uso de Banco de Dados Relacional - SQLite;● API padrão do Android - Presente desde o Android 1.0;● Código pesado, principalmente para novatos na plataforma ou oriundos de

concorrentes, como iOS e wPhone;● Só uma olhadinha rápida:● https://developer.android.com/training/basics/data-storage/databases.html?hl=

pt-br

Page 5: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Realm

Page 6: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Realm● Promete ser mais rápido que qualquer outra solução de ORM;● Promete ser mais rápido que o SQLite puro;● Mais simples e Mais rápido;● Suporte para:

○ Java/Android○ Objective-C;○ Swift;○ Xamarim;○ React Native;

Page 7: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Instalação - Pré-Requisitos● Não suporta Java a não ser no Android. Neste momento.● Android Studio >= 1.5.1.● Versão do JDK >= 7.● Android Api Level 9 ou superior (Android 2.3 Gingerbread).

Page 8: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Configuração da Biblioteca● Gradle a nível de projeto:

buildscript { repositories {

jcenter() } dependencies {

classpath

"io.realm:realm-gradle-plugin:<versao>"

} }

Page 9: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Configuração da Biblioteca● Gradle a nível de módulo:

apply plugin: 'realm-android'

Page 10: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Modelo De Dados● Uma simples classe que herda de RealmObject;● Anotação para detalhes importantes de um banco de dados relacional, como o

@PrimeryKey para chave primária;● Documentação detalha outras anotações e tipos de dados:

https://realm.io/docs/java

Page 11: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Modelo De Dadospublic class Task extends RealmObject{ @PrimaryKey public String nome; public String descricao; public long termino; public String local; public boolean iniciada;

@Override public String toString() { Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(termino); int dia = cal.get(Calendar.DAY_OF_MONTH); ...

return "Nome: " + nome + "\nDescrição: " + descricao + "\nTérmino: " + (dia < 10 ? "0" + dia : "" + dia) + "/" + …); }}

Page 12: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

RealmConfiguration e Realm● Necessária a criação de uma configuração para o Realm (Migração, Encriptação);● Posteriormente cria-se a própria instância de Realm (Trabalha diretamente sobre

os dados);● Indicado usar em uma classe que estende de Application;

public class CoreApplication extends Application{

public Realm realm;

@Override public void onCreate() { super.onCreate(); RealmConfiguration realmConfig = new RealmConfiguration.Builder(this).deleteRealmIfMigrationNeeded().build(); Realm.setDefaultConfiguration(realmConfig); realm = Realm.getDefaultInstance(); }}

Page 13: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Pesquisando Dados● A classe Realm possui o método where que define o alvo das pesquisas;● Depois, nos traz uma infinidade de métodos que espelham grande parte das

pesquisas com SQL;● Métodos auxiliares do SQL como count e average também estão presentes;● Perceba o uso do método Assíncrono. O changeListener recebe o resultado

da pesquisa.

@Overrideprotected void onCreate(Bundle savedInstanceState) { ...

RealmResults<Task> result = ((CoreApplication)getApplication()).realm.where(Task.class).findAllAsync(); result.addChangeListener(callback);}

Page 14: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Pesquisando Dados● O Listener possui um único método a ser sobrescrito;● O RealResults<Task> se usado no mesmo contexto da instância de Realm, mantém o listener

ativo e registra qualquer mudança nos dados.● O RealmResults também precisa ser único para manter o callback para futuras atualizações.● Método sort para ordenação dos resultados;

public static RealmResults<Task> results;private RealmChangeListener callback = new RealmChangeListener() { public void onChange(Object element) { results = (RealmResults<Task>) element; results = results.sort("termino", Sort.ASCENDING); listTasks.setAdapter(new ArrayAdapter<Task>( MainActivity.this, android.R.layout.simple_list_item_1, results ) ); }};

Page 15: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Excluindo

● Usando a mesma instância de Realm da Application;● Método executeTransaction é síncrono;● Opção de trabalho assíncrono. Porém, neste caso obrigatoriamente, precisamos

usar a opção síncrona.● Na própria instância RealmObject é possível chamar deleteFromRealm.

//só pode ser feito da mesma thread onde o objeto foi criado((CoreApplication)getApplication()).realm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { task.deleteFromRealm(); }});//results.deleteFirstFromRealm(); //results.deleteLastFromRealm();

Page 16: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Salvar Dados

● Executamos uma tarefa assíncrona;● A assinatura do método recebe a implementação de um método de sucesso e de erro;

Task result = ((CoreApplication)getApplication()).realm.where(Task.class).equalTo("nome", key).findFirst();saveTaskNome.setText(result.nome);…

((CoreApplication)getApplication()).realm.executeTransactionAsync(new Realm.Transaction() { @Override public void execute(Realm bgRealm) { Task task = new Task(); task.nome = saveTaskNome.getText().toString(); ... bgRealm.copyToRealmOrUpdate(task); }}, new Realm.Transaction.OnSuccess() { public void onSuccess() {}}, new Realm.Transaction.OnError() { public void onError(Throwable error) {}});

Page 17: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Firebase

Page 18: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

O que é?● Um set de ferramentas que auxiliam e agilizam o processo de

desenvolvimento de aplicativos móveis;

Page 19: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Detalhes

● Android;● Web;● iOS;● Alguns serviços gratuitos, alguns pagos e, também tem serviços com o modelo

de cotas;● Pré-Requisitos para Android:

○ Android 2.3 ou superior;○ Google Play Services 9.0.2 ou superior;○ O Google Play Services SDK;○ Android Studio 1.5 ou Superior;○ Um projeto Android Studio e seu package name;

Page 20: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Configuração no Android - Passo 1

● Acessar o console do Firebase: https://console.firebase.google.com.

Page 21: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Configuração no Android - Passo 2

● Criar o novo Projeto.

Page 22: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Configuração no Android - Passo 2

● Dashboard do projeto:

Page 23: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Configuração no Android - Passo 3.1

● Adicionar o Firebase ao Projeto Android:

Page 24: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Configuração no Android - Passo 3.2

● Adicionar o Firebase ao Projeto Android:

Page 25: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Configuração no Android - Passo 3.3

Page 26: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Pronto!

● Se essa tela apareceu, está tudo certo e o projeto Firebase adicionado no projeto Android!!!!

Page 27: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Base de Dados

● Base de dados NOSQL. Tudo é JSON.

Page 28: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Base de Dados

● Para inicializar a base de dados podemos gerar um JSON;● Minha dica: Json Generator: http://www.json-generator.com/;

Page 29: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Base de Dados

● O Json Generator permite o download do arquivo .json;● No console do Firebase apenas importe o arquivo:

Page 30: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Base de Dados

● Logo a estrutura dos objetos Json vai ficar visível;● Todos os dados podem ser editados;

Page 31: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

E o Android???

● Todo o segredo é usar as classes FirebaseDatabase e DatabaseReference para criar uma conexão com um path do bando de dados NOSql.

compile 'com.google.firebase:firebase-database:9.0.2'

FirebaseDatabase refCurrent = FirebaseDatabase.getInstance();DatabaseReference myRef = refCurrent.getReference("tarefas");

compile 'com.google.firebase:firebase-database:9.0.2'

Page 32: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Pesquisa de Dados e Realtime Database● As pesquisas de dados são possíveis com métodos que simulam boa parte das

consultas sql: queries, order by, first, limit, dentre outros;● Na query ou na referência, temos listeners que funcionam realtime;

Query query = myRef.orderByChild("termino");query.addValueEventListener(new ValueEventListener() { public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot snap : dataSnapshot.getChildren()){ if (Integer.parseInt(snap.getKey()) > key){ key = Integer.parseInt(snap.getKey()); } Task task = snap.getValue(Task.class); } } public void onCancelled(DatabaseError databaseError) { }}

});

Page 33: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Novos Dados

● Cria-se um novo filho na referência pai;● Configuramos um valor para este filho que, pode ser a instância de uma classe

que espelha os objetos do JSON no banco de dados;

Task task = new Task();task.nome = "Outra tarefa";task.iniciada = false;task.local = "Home";task.termino = 22334455;task.descricao = "Somente outra tarefa";myRef.child("" + ++key).setValue(task);

Page 34: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Alteração de Dados

● Basta setar o valor de uma referência. Como nosso listener atua 100% do tempo a própria interface da aplicação será atualizada;

…tasks.get(position).termino = System.currentTimeMillis();

DatabaseReference refItem = refCurrent.getReference("tarefas/" + (position + 1));refItem.setValue(tasks.get(position));...

});

Page 35: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Remover Dados

● Basta configurar o valor de um filho para null;● Ou ainda, de uma forma mais elegante, chamar o método removeValue

diretamente em uma referência;

…DatabaseReference refItem = refCurrent.getReference("tarefas/" + (position + 1));refItem.removeValue();...

});

Page 36: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Conclusão

● O que é mesmo SQLiteOpenHelper;● Opções rápidas e mais próximas ao código Java;● Baixo custo e/ou grátis;

Page 37: TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no Android

Perguntas

● Obrigado GDG;● Obrigado IFSUL;● Obrigado professor Élder Bernardi;● Obrigado a todos!!!