SlideShare a Scribd company logo
1 of 36
Download to read offline
Persistência com Realm.io
Pedro Salomão
@ppgsalomao
ppgsalomao@gmail.com / pedro@onyo.com
#whoami
Persistência
O que é persistência?
Quando devemos buscar
uma biblioteca?
Realm resolve todos os
problemas de persistência?
Existe bala de prata?
O que precisamos saber
para usar o Realm?
Must know
Android Threads
ProGuard
Realm.io
Documentação
https://realm.io/
buildscript	
  {	
  
	
  	
  	
  	
  repositories	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  jcenter()	
  
	
  	
  	
  	
  }	
  
}	
  
dependencies	
  {	
  
	
  	
  	
  	
  compile	
  'io.realm:realm-­‐android:0.82.2'	
  
}
../your_module/build.gradle
-­‐keep	
  class	
  io.realm.annotations.RealmModule	
  
-­‐keep	
  @io.realm.annotations.RealmModule	
  class	
  *	
  
-­‐dontwarn	
  javax.**	
  
-­‐dontwarn	
  io.realm.**
../your_module/proguard-­‐rules.pro
Modelos
Modelo
public class User extends RealmObject {
private String name;
private boolean boolValue;
private short number;
private int number2;
private long number3;
private float fractionNumber;
private double fractionNumber2;
private byte[] bytes;
private Date date;
private RealmObject object;
private RealmList<? extends RealmObject> list;
@PrimaryKey
private int id; // inteiros ou String
@Index
private int index; // Tipos primitivos
@Ignore
private int sessionId;
// Getters & Setters padrão
public String getName() { return name; }
public void setName(String name) { this.name = name; }
…
}
Tips & Tricks - Modelos
Todos os inteiros são mapeados para long, inclusive
os Wrappers.
Não é possível armazenar null para nenhum tipo
diferente de RealmObject ou RealmLists.
Os getters e setters são obrigatórios para todas as
propriedades não anotadas com @Ignore.
Getters e Setters são alterados depois pelo Realm,
então qualquer implementação diferente é descartada.
Tips & Tricks - Modelos
Todos os atributos devem ser privados.
Métodos e atributos estáticos são liberados.
@PrimaryKey não pode ser usada em mais de um
atributo.
@PrimaryKey já define implicitamente o @Index para
o atributo.
Tips & Tricks - Modelos
Nome da classe deve ter no máximo 57 caracteres.
Nome de atributo deve ter no máximo 63 caracteres
Datas são armazenadas com precisão de segundos,
no período 13/12/1900 e 19/01/2038.
Strings e byte[] devem ter no máximo 16mb.
Transações
Transações
Realm realm = Realm.getInstance(this);
realm.beginTransaction();
// Insere, altera ou remove objetos da base
realm.commitTransaction();
realm.cancelTransaction();
Realm realm = Realm.getInstance(this);
realm.executeTransaction((realm) -> {
// Insere, altera ou remove objetos da base
});
Realm realm = Realm.getInstance(this);
realm.executeTransaction(new Realm.Transaction() {

@Override

public void execute(Realm realm) {
// Insere, altera ou remove objetos da base
}
});
Explicitamente
Realm + Lambda
Realm
Tips & Tricks - Transações
São obrigatórias para qualquer alteração na base de
dados.
Dados só são persistidos no disco após o commit da
transação.
Operações de escrita no banco bloqueiam outras
transações de escrita e podem demorar.
ATENÇÃO: Não faça operações de escrita no banco
na UI Thread.
Tips & Tricks - Transações
Divida o processo em criar objetos e gravar no
banco.
Escritas no banco não bloqueiam a leitura do
mesmo.
Transações aninhadas (uma transação dentro de outra
transação) não são suportadas e geram exceção.
Gravando no Banco
Criando objetos
User user = realm.createObject(User.class); // Create a new object
user.setName("John");
user.setEmail("john@corporation.com");
User user = new User("John");
user.setEmail("john@corporation.com");
User realmUser = realm.copyToRealm(user);
String json = ...;
realm.createObjectFromJson(User.class, json);
String json = ...;
realm.createOrUpdateObjectFromJson(User.class, json);
Tips & Tricks - Objetos
Manipulação de objetos deve sempre ocorrer dentro
de uma transação.
O objeto só pode ser usado na Thread em que ele foi
criado.
Pode-se criar um Wrapper para o objeto para poder
transitá-lo entre threads e inserir métodos nele.
Cuidado com restrições definidas por PrimaryKey ao
inserir ou atualizar objetos.
Fazendo consultas
Consultas
// Criando a consulta para pegar todos os usuários.
RealmQuery<User> query = realm.where(User.class);
// Adiciona as condições
query.equalTo("nome", "Joao");
query.or().equalTo("nome", "Pedro");
// Executa a consulta
RealmResults<User> resultado = query.findAll();
// Fazendo tudo junto
RealmResults<User> resultado = realm.where(User.class)
.equalTo("nome", "Joao")
.or()
.equalTo("nome", "Pedro")
.findAll();
Consultas
// Agrupando Operadores Lógicos
RealmResults<User> resultado = realm.where(User.class)
.greaterThan(“idade”, 10)
.beginGroup()
.equalTo("nome", "Joao")
.or()
.contains("nome", “Paulo")
.endGroup()
.findAll();
// Encadeando consultas
RealmResults<User> adolescentes = realm.where(User.class)
.between(“idade”, 13, 20)
.findAll();
User primeiroJoao = adolescentes.where()
.equalTo("nome", "Joao")
.findFirst();
Consultas
// Funções de agregação
long sum = resultado.sum("idade").longValue();
long min = resultado.min("idade").longValue();
long max = resultado.max("idade").longValue();
double average = resultado.average("idade");
long matches = result.size();
// Ordenando o resultado
RealmResults<User> result = realm.where(User.class).findAll();
result.sort("idade"); // Sort ascending
result.sort(""idade", RealmResults.SORT_ORDER_DESCENDING);
// Ordenando já na consulta
RealmResults<User> result = realm.where(User.class).findAllSorted("idade");
Consultas
public class User extends RealmObject {
...
private RealmList<Email> emails;
...
}
public class Email extends RealmObject {
...
private boolean active;
...
}
RealmResults<Contact> contacts = realm.where(Contact.class)
.equalTo("emails.active", true)
.findAll();
public class User extends RealmObject {
...
private RealmList<Email> emails;
...
}
public class Email extends RealmObject {
...
private boolean active;
...
}
RealmResults<Contact> contacts = realm.where(Contact.class)
.equalTo("emails.active", true)
.equalTo("emails.active", false)
.findAll();
Tips & Tricks - Consultas
Cuidado com o nome das propriedades na hora de
filtrar para evitar erros de digitação.
Só é possível ordenar utilizando os campos que
estão no modelo de retorno.
Não é possível fazer GROUP BY como é feito no
SQL.
Todas as consultas são LAZY.
Removendo da Base
Remoção
// Remover o objeto de um resultado.
result.remove(0);
result.removeLast();
// Remover um objeto específico.
User usuario = result.get(5);
usuario.removeFromRealm();
// Remover todos os objetos de um resultado.
result.clear();
Utilitários
Integrando com a Aplicação
Utilitários
Notificações
Migrações
Criptografia
RealmBaseAdapter
Integração
com outras
bibliotecas
Parceler
Robolectric
Geral
Tips & Tricks - Geral
public abstract class AbstractRealmPersistenceService {
private Context context;
private Realm realm;
private int currentThreadId;
public AbstractRealmPersistenceService(Context context) {
this(context, null);
}
public AbstractRealmPersistenceService(Context context, Realm realm) {
this.context = context;
this.realm = realm;
this.currentThreadId = android.os.Process.myTid();
}
protected Realm getRealm() {
this.reloadRealm();
return this.realm;
}
private void reloadRealm() {
int threadId = android.os.Process.myTid();
if(this.currentThreadId != threadId || this.realm == null) {
this.realm = Realm.getInstance(this.context);
this.currentThreadId = threadId;
}
}
}
Tips & Tricks - Geral
Cuidado com a transição entre Threads, principalmente
se você faz operações em Background.
Dúvidas?
Pedro Salomão
@ppgsalomao
Obrigado!
Estamos contratando!
Pedro Salomão
@ppgsalomao
ppgsalomao@gmail.com / pedro@onyo.com

More Related Content

What's hot

A primeira app iOS (a gente não esquece)
A primeira app iOS (a gente não esquece)A primeira app iOS (a gente não esquece)
A primeira app iOS (a gente não esquece)Ricardo Valeriano
 
Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Douglas Mendes
 
Introdução ao desenvolvimento de jogos em OGRE 3D - Mackenzie
Introdução ao desenvolvimento de jogos em OGRE 3D - MackenzieIntrodução ao desenvolvimento de jogos em OGRE 3D - Mackenzie
Introdução ao desenvolvimento de jogos em OGRE 3D - Mackenziejonathanblacknight
 
Spock Framework 2
Spock Framework 2Spock Framework 2
Spock Framework 2Ismael
 
JavaFX e Scala - Como Leite com Bolacha
JavaFX e Scala - Como Leite com BolachaJavaFX e Scala - Como Leite com Bolacha
JavaFX e Scala - Como Leite com BolachaRafael Afonso
 
Threads 04 Variáveis atômicas
Threads 04 Variáveis atômicasThreads 04 Variáveis atômicas
Threads 04 Variáveis atômicasHelder da Rocha
 
Ferramentas para desenvolvimento no blockchain Ethereum
Ferramentas para desenvolvimento no blockchain EthereumFerramentas para desenvolvimento no blockchain Ethereum
Ferramentas para desenvolvimento no blockchain EthereumOriginalMy.com
 
Thiago Valle e Heitor Repolho - Utilizando sparta para para desenvolvimento d...
Thiago Valle e Heitor Repolho - Utilizando sparta para para desenvolvimento d...Thiago Valle e Heitor Repolho - Utilizando sparta para para desenvolvimento d...
Thiago Valle e Heitor Repolho - Utilizando sparta para para desenvolvimento d...INdT
 
Aula actionscript basico
Aula actionscript basicoAula actionscript basico
Aula actionscript basicoWemerson Silva
 

What's hot (18)

Desenvolvimento iOS
Desenvolvimento iOSDesenvolvimento iOS
Desenvolvimento iOS
 
A primeira app iOS (a gente não esquece)
A primeira app iOS (a gente não esquece)A primeira app iOS (a gente não esquece)
A primeira app iOS (a gente não esquece)
 
Aprendendo ruby
Aprendendo rubyAprendendo ruby
Aprendendo ruby
 
Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)
 
OOP ObjC
OOP ObjCOOP ObjC
OOP ObjC
 
Introdução ao desenvolvimento de jogos em OGRE 3D - Mackenzie
Introdução ao desenvolvimento de jogos em OGRE 3D - MackenzieIntrodução ao desenvolvimento de jogos em OGRE 3D - Mackenzie
Introdução ao desenvolvimento de jogos em OGRE 3D - Mackenzie
 
Spock Framework 2
Spock Framework 2Spock Framework 2
Spock Framework 2
 
JavaFX e Scala - Como Leite com Bolacha
JavaFX e Scala - Como Leite com BolachaJavaFX e Scala - Como Leite com Bolacha
JavaFX e Scala - Como Leite com Bolacha
 
Java 06
Java 06Java 06
Java 06
 
Threads 04 Variáveis atômicas
Threads 04 Variáveis atômicasThreads 04 Variáveis atômicas
Threads 04 Variáveis atômicas
 
Ferramentas para desenvolvimento no blockchain Ethereum
Ferramentas para desenvolvimento no blockchain EthereumFerramentas para desenvolvimento no blockchain Ethereum
Ferramentas para desenvolvimento no blockchain Ethereum
 
Thiago Valle e Heitor Repolho - Utilizando sparta para para desenvolvimento d...
Thiago Valle e Heitor Repolho - Utilizando sparta para para desenvolvimento d...Thiago Valle e Heitor Repolho - Utilizando sparta para para desenvolvimento d...
Thiago Valle e Heitor Repolho - Utilizando sparta para para desenvolvimento d...
 
Aula actionscript basico
Aula actionscript basicoAula actionscript basico
Aula actionscript basico
 
Javascript
JavascriptJavascript
Javascript
 
Floggy-IIBoot-2008-09-25
Floggy-IIBoot-2008-09-25Floggy-IIBoot-2008-09-25
Floggy-IIBoot-2008-09-25
 
JavaScript Hacks
JavaScript HacksJavaScript Hacks
JavaScript Hacks
 
Palestra2009
Palestra2009Palestra2009
Palestra2009
 
Threads 09: Paralelismo
Threads 09: ParalelismoThreads 09: Paralelismo
Threads 09: Paralelismo
 

Viewers also liked

MobileConf 2013 GCM
MobileConf 2013 GCM MobileConf 2013 GCM
MobileConf 2013 GCM rlecheta
 
Testes Unitários no Android
Testes Unitários no AndroidTestes Unitários no Android
Testes Unitários no AndroidOnyo
 
My presentation
My presentationMy presentation
My presentation1111108
 
Samsung smart signage dbd series displays brochure
Samsung smart signage dbd series displays brochure Samsung smart signage dbd series displays brochure
Samsung smart signage dbd series displays brochure Linda Sithole
 
Technologies to support self-directed learning through social interaction
Technologies to support self-directed learning through social interactionTechnologies to support self-directed learning through social interaction
Technologies to support self-directed learning through social interactionDragan Gasevic
 
Moving Sustainability to the Core of Strategic Sourcing
Moving Sustainability to the Core of Strategic SourcingMoving Sustainability to the Core of Strategic Sourcing
Moving Sustainability to the Core of Strategic SourcingJustin Sullivan
 
Practical Container Security by Mrunal Patel and Thomas Cameron, Red Hat
Practical Container Security by Mrunal Patel and Thomas Cameron, Red HatPractical Container Security by Mrunal Patel and Thomas Cameron, Red Hat
Practical Container Security by Mrunal Patel and Thomas Cameron, Red HatDocker, Inc.
 
E-Commerce User Experience & Usability
E-Commerce User Experience & UsabilityE-Commerce User Experience & Usability
E-Commerce User Experience & UsabilityINM AG
 

Viewers also liked (12)

MobileConf 2013 GCM
MobileConf 2013 GCM MobileConf 2013 GCM
MobileConf 2013 GCM
 
Testes Unitários no Android
Testes Unitários no AndroidTestes Unitários no Android
Testes Unitários no Android
 
My presentation
My presentationMy presentation
My presentation
 
9 клас
9 клас9 клас
9 клас
 
Samsung smart signage dbd series displays brochure
Samsung smart signage dbd series displays brochure Samsung smart signage dbd series displays brochure
Samsung smart signage dbd series displays brochure
 
Drepte paralele
Drepte paraleleDrepte paralele
Drepte paralele
 
2016-10-05 New FLSA Overtime Changes
2016-10-05 New FLSA Overtime Changes2016-10-05 New FLSA Overtime Changes
2016-10-05 New FLSA Overtime Changes
 
Technologies to support self-directed learning through social interaction
Technologies to support self-directed learning through social interactionTechnologies to support self-directed learning through social interaction
Technologies to support self-directed learning through social interaction
 
Moving Sustainability to the Core of Strategic Sourcing
Moving Sustainability to the Core of Strategic SourcingMoving Sustainability to the Core of Strategic Sourcing
Moving Sustainability to the Core of Strategic Sourcing
 
6 клас пропорц
6 клас пропорц6 клас пропорц
6 клас пропорц
 
Practical Container Security by Mrunal Patel and Thomas Cameron, Red Hat
Practical Container Security by Mrunal Patel and Thomas Cameron, Red HatPractical Container Security by Mrunal Patel and Thomas Cameron, Red Hat
Practical Container Security by Mrunal Patel and Thomas Cameron, Red Hat
 
E-Commerce User Experience & Usability
E-Commerce User Experience & UsabilityE-Commerce User Experience & Usability
E-Commerce User Experience & Usability
 

Similar to Persistência com Realm.io

Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasRodrigo Branas
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
 
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...tdc-globalcode
 
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsTDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsDiego Castro
 
Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-androidAlberto Souza
 
Live Tiles e Background Executions - TDC SP 2015
Live Tiles e Background Executions - TDC SP 2015Live Tiles e Background Executions - TDC SP 2015
Live Tiles e Background Executions - TDC SP 2015talkitbr
 
A explosão do Node.js: JavaScript é o novo preto
A explosão do Node.js: JavaScript é o novo pretoA explosão do Node.js: JavaScript é o novo preto
A explosão do Node.js: JavaScript é o novo pretoNando Vieira
 
Construindo portlets para IBM WebSphere Portal – Parte 2
Construindo portlets para IBM WebSphere Portal – Parte 2Construindo portlets para IBM WebSphere Portal – Parte 2
Construindo portlets para IBM WebSphere Portal – Parte 2rodrigoareis
 
Nem tudo é Pepino: Cucumber x Robot Framework
Nem tudo é Pepino: Cucumber x Robot FrameworkNem tudo é Pepino: Cucumber x Robot Framework
Nem tudo é Pepino: Cucumber x Robot FrameworkRodrigo Matola
 
Conectando o Android a outros sistemas
Conectando o Android a outros sistemasConectando o Android a outros sistemas
Conectando o Android a outros sistemasElias Junior
 
Cacheamento Lado Servidor
Cacheamento Lado ServidorCacheamento Lado Servidor
Cacheamento Lado ServidorMario Guedes
 

Similar to Persistência com Realm.io (20)

RMI em Java
RMI em JavaRMI em Java
RMI em Java
 
Realtime com node.js e socket.io
Realtime com node.js e socket.ioRealtime com node.js e socket.io
Realtime com node.js e socket.io
 
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
 
Java e orientação a objetos
Java e orientação a objetosJava e orientação a objetos
Java e orientação a objetos
 
Evento CODERS
Evento CODERSEvento CODERS
Evento CODERS
 
Minicurso groovy grails
Minicurso groovy grailsMinicurso groovy grails
Minicurso groovy grails
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
 
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsTDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
 
Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-android
 
Live Tiles e Background Executions - TDC SP 2015
Live Tiles e Background Executions - TDC SP 2015Live Tiles e Background Executions - TDC SP 2015
Live Tiles e Background Executions - TDC SP 2015
 
Funmentos de Objetos Remotos
Funmentos de Objetos RemotosFunmentos de Objetos Remotos
Funmentos de Objetos Remotos
 
Fundamentos de Objetos Remotos
Fundamentos de Objetos RemotosFundamentos de Objetos Remotos
Fundamentos de Objetos Remotos
 
A explosão do Node.js: JavaScript é o novo preto
A explosão do Node.js: JavaScript é o novo pretoA explosão do Node.js: JavaScript é o novo preto
A explosão do Node.js: JavaScript é o novo preto
 
Construindo portlets para IBM WebSphere Portal – Parte 2
Construindo portlets para IBM WebSphere Portal – Parte 2Construindo portlets para IBM WebSphere Portal – Parte 2
Construindo portlets para IBM WebSphere Portal – Parte 2
 
Nem tudo é Pepino: Cucumber x Robot Framework
Nem tudo é Pepino: Cucumber x Robot FrameworkNem tudo é Pepino: Cucumber x Robot Framework
Nem tudo é Pepino: Cucumber x Robot Framework
 
Conectando o Android a outros sistemas
Conectando o Android a outros sistemasConectando o Android a outros sistemas
Conectando o Android a outros sistemas
 
Cacheamento Lado Servidor
Cacheamento Lado ServidorCacheamento Lado Servidor
Cacheamento Lado Servidor
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
Floggy-GUJavaSC-2008-09-20
Floggy-GUJavaSC-2008-09-20Floggy-GUJavaSC-2008-09-20
Floggy-GUJavaSC-2008-09-20
 

Recently uploaded

ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docxATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfSamaraLunas
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuisKitota
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 

Recently uploaded (9)

ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docxATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 

Persistência com Realm.io

  • 1. Persistência com Realm.io Pedro Salomão @ppgsalomao ppgsalomao@gmail.com / pedro@onyo.com
  • 3. Persistência O que é persistência? Quando devemos buscar uma biblioteca? Realm resolve todos os problemas de persistência? Existe bala de prata?
  • 4. O que precisamos saber para usar o Realm?
  • 8. buildscript  {          repositories  {                  jcenter()          }   }   dependencies  {          compile  'io.realm:realm-­‐android:0.82.2'   } ../your_module/build.gradle -­‐keep  class  io.realm.annotations.RealmModule   -­‐keep  @io.realm.annotations.RealmModule  class  *   -­‐dontwarn  javax.**   -­‐dontwarn  io.realm.** ../your_module/proguard-­‐rules.pro
  • 10. Modelo public class User extends RealmObject { private String name; private boolean boolValue; private short number; private int number2; private long number3; private float fractionNumber; private double fractionNumber2; private byte[] bytes; private Date date; private RealmObject object; private RealmList<? extends RealmObject> list; @PrimaryKey private int id; // inteiros ou String @Index private int index; // Tipos primitivos @Ignore private int sessionId; // Getters & Setters padrão public String getName() { return name; } public void setName(String name) { this.name = name; } … }
  • 11. Tips & Tricks - Modelos Todos os inteiros são mapeados para long, inclusive os Wrappers. Não é possível armazenar null para nenhum tipo diferente de RealmObject ou RealmLists. Os getters e setters são obrigatórios para todas as propriedades não anotadas com @Ignore. Getters e Setters são alterados depois pelo Realm, então qualquer implementação diferente é descartada.
  • 12. Tips & Tricks - Modelos Todos os atributos devem ser privados. Métodos e atributos estáticos são liberados. @PrimaryKey não pode ser usada em mais de um atributo. @PrimaryKey já define implicitamente o @Index para o atributo.
  • 13. Tips & Tricks - Modelos Nome da classe deve ter no máximo 57 caracteres. Nome de atributo deve ter no máximo 63 caracteres Datas são armazenadas com precisão de segundos, no período 13/12/1900 e 19/01/2038. Strings e byte[] devem ter no máximo 16mb.
  • 15. Transações Realm realm = Realm.getInstance(this); realm.beginTransaction(); // Insere, altera ou remove objetos da base realm.commitTransaction(); realm.cancelTransaction(); Realm realm = Realm.getInstance(this); realm.executeTransaction((realm) -> { // Insere, altera ou remove objetos da base }); Realm realm = Realm.getInstance(this); realm.executeTransaction(new Realm.Transaction() {
 @Override
 public void execute(Realm realm) { // Insere, altera ou remove objetos da base } }); Explicitamente Realm + Lambda Realm
  • 16. Tips & Tricks - Transações São obrigatórias para qualquer alteração na base de dados. Dados só são persistidos no disco após o commit da transação. Operações de escrita no banco bloqueiam outras transações de escrita e podem demorar. ATENÇÃO: Não faça operações de escrita no banco na UI Thread.
  • 17. Tips & Tricks - Transações Divida o processo em criar objetos e gravar no banco. Escritas no banco não bloqueiam a leitura do mesmo. Transações aninhadas (uma transação dentro de outra transação) não são suportadas e geram exceção.
  • 19. Criando objetos User user = realm.createObject(User.class); // Create a new object user.setName("John"); user.setEmail("john@corporation.com"); User user = new User("John"); user.setEmail("john@corporation.com"); User realmUser = realm.copyToRealm(user); String json = ...; realm.createObjectFromJson(User.class, json); String json = ...; realm.createOrUpdateObjectFromJson(User.class, json);
  • 20. Tips & Tricks - Objetos Manipulação de objetos deve sempre ocorrer dentro de uma transação. O objeto só pode ser usado na Thread em que ele foi criado. Pode-se criar um Wrapper para o objeto para poder transitá-lo entre threads e inserir métodos nele. Cuidado com restrições definidas por PrimaryKey ao inserir ou atualizar objetos.
  • 22. Consultas // Criando a consulta para pegar todos os usuários. RealmQuery<User> query = realm.where(User.class); // Adiciona as condições query.equalTo("nome", "Joao"); query.or().equalTo("nome", "Pedro"); // Executa a consulta RealmResults<User> resultado = query.findAll(); // Fazendo tudo junto RealmResults<User> resultado = realm.where(User.class) .equalTo("nome", "Joao") .or() .equalTo("nome", "Pedro") .findAll();
  • 23. Consultas // Agrupando Operadores Lógicos RealmResults<User> resultado = realm.where(User.class) .greaterThan(“idade”, 10) .beginGroup() .equalTo("nome", "Joao") .or() .contains("nome", “Paulo") .endGroup() .findAll(); // Encadeando consultas RealmResults<User> adolescentes = realm.where(User.class) .between(“idade”, 13, 20) .findAll(); User primeiroJoao = adolescentes.where() .equalTo("nome", "Joao") .findFirst();
  • 24. Consultas // Funções de agregação long sum = resultado.sum("idade").longValue(); long min = resultado.min("idade").longValue(); long max = resultado.max("idade").longValue(); double average = resultado.average("idade"); long matches = result.size(); // Ordenando o resultado RealmResults<User> result = realm.where(User.class).findAll(); result.sort("idade"); // Sort ascending result.sort(""idade", RealmResults.SORT_ORDER_DESCENDING); // Ordenando já na consulta RealmResults<User> result = realm.where(User.class).findAllSorted("idade");
  • 25. Consultas public class User extends RealmObject { ... private RealmList<Email> emails; ... } public class Email extends RealmObject { ... private boolean active; ... } RealmResults<Contact> contacts = realm.where(Contact.class) .equalTo("emails.active", true) .findAll(); public class User extends RealmObject { ... private RealmList<Email> emails; ... } public class Email extends RealmObject { ... private boolean active; ... } RealmResults<Contact> contacts = realm.where(Contact.class) .equalTo("emails.active", true) .equalTo("emails.active", false) .findAll();
  • 26. Tips & Tricks - Consultas Cuidado com o nome das propriedades na hora de filtrar para evitar erros de digitação. Só é possível ordenar utilizando os campos que estão no modelo de retorno. Não é possível fazer GROUP BY como é feito no SQL. Todas as consultas são LAZY.
  • 28. Remoção // Remover o objeto de um resultado. result.remove(0); result.removeLast(); // Remover um objeto específico. User usuario = result.get(5); usuario.removeFromRealm(); // Remover todos os objetos de um resultado. result.clear();
  • 32. Geral
  • 33. Tips & Tricks - Geral public abstract class AbstractRealmPersistenceService { private Context context; private Realm realm; private int currentThreadId; public AbstractRealmPersistenceService(Context context) { this(context, null); } public AbstractRealmPersistenceService(Context context, Realm realm) { this.context = context; this.realm = realm; this.currentThreadId = android.os.Process.myTid(); } protected Realm getRealm() { this.reloadRealm(); return this.realm; } private void reloadRealm() { int threadId = android.os.Process.myTid(); if(this.currentThreadId != threadId || this.realm == null) { this.realm = Realm.getInstance(this.context); this.currentThreadId = threadId; } } }
  • 34. Tips & Tricks - Geral Cuidado com a transição entre Threads, principalmente se você faz operações em Background.