SlideShare uma empresa Scribd logo
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

Mais conteúdo relacionado

PDF
Passagem de Objetos entre Java e Oracle
ODP
Certificação Digital - Aula1 Exercícios
PDF
Ecmascript 6, O futuro do Javascript hoje.
PDF
Resolvendo problemas de dependências com o Bundler
PDF
Resolvendo problemas com o Bbundler
PPTX
Javascript avançado
PDF
Threads 08: Executores e Futures
PPT
Spock Framework
Passagem de Objetos entre Java e Oracle
Certificação Digital - Aula1 Exercícios
Ecmascript 6, O futuro do Javascript hoje.
Resolvendo problemas de dependências com o Bundler
Resolvendo problemas com o Bbundler
Javascript avançado
Threads 08: Executores e Futures
Spock Framework

Mais procurados (18)

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

Destaque (12)

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

Semelhante a Persistência com Realm.io (20)

PPTX
Iniciando com realm
PDF
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
PDF
Xamarin & Realm
PPTX
Persistência com JPA e Hibernate
PPT
Hibernate
PPT
Aula JPA
PDF
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
PDF
Persistência JPA
PDF
Introdução a JPA (2010)
PDF
Hibernate conceitos
ODP
Anotações do mapeamento OR
PPT
Floggy-JustJava-2008-09-10
PPT
Curso De Hibernate 3
PDF
MongoDB outras alternativas de persistência
PDF
Persistência de Dados no SQLite com Room
PPTX
Aula05 android persistencia
PDF
Introdução ao JPA com Hibernate
PDF
Introdução ao JPA com Hibernate
PDF
Programação Orientada a Objetos - Pós Graduação - Aula 2
PDF
Desenvolvimento em .Net - nHibernate
Iniciando com realm
TDC2016POA | Trilha Banco de Dados - Firebase e Realm, o NoSQL ganha força no...
Xamarin & Realm
Persistência com JPA e Hibernate
Hibernate
Aula JPA
Java EE 6 JPA 2.0, EJB 3.1 e CDI 1.0
Persistência JPA
Introdução a JPA (2010)
Hibernate conceitos
Anotações do mapeamento OR
Floggy-JustJava-2008-09-10
Curso De Hibernate 3
MongoDB outras alternativas de persistência
Persistência de Dados no SQLite com Room
Aula05 android persistencia
Introdução ao JPA com Hibernate
Introdução ao JPA com Hibernate
Programação Orientada a Objetos - Pós Graduação - Aula 2
Desenvolvimento em .Net - nHibernate

Último (16)

PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PDF
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PDF
Processos na gestão de transportes, TM100 Col18
PPTX
Arquitetura de computadores - Memórias Secundárias
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Processos na gestão de transportes, TM100 Col18
Arquitetura de computadores - Memórias Secundárias
Custos e liquidação no SAP Transportation Management, TM130 Col18
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
COBITxITIL-Entenda as diferença em uso governança TI
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...

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.