persistência com realm.io

36
Persistência com Realm.io Pedro Salomão @ppgsalomao [email protected] / [email protected]

Upload: onyo

Post on 21-Jan-2017

317 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Persistência com Realm.io

Persistência com Realm.io

Pedro Salomão @ppgsalomao

[email protected] / [email protected]

Page 2: Persistência com Realm.io

#whoami

Page 3: Persistência com Realm.io

Persistência

O que é persistência?

Quando devemos buscar uma biblioteca?

Realm resolve todos os problemas de persistência?

Existe bala de prata?

Page 4: Persistência com Realm.io

O que precisamos saber para usar o Realm?

Page 5: Persistência com Realm.io

Must knowAndroid Threads

ProGuard

Page 6: Persistência com Realm.io

Realm.io

Page 7: Persistência com Realm.io

Documentaçãohttps://realm.io/

Page 8: Persistência com 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

Page 9: Persistência com Realm.io

Modelos

Page 10: Persistência com Realm.io

Modelopublic 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; }

…}

Page 11: Persistência com Realm.io

Tips & Tricks - ModelosTodos 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.

Page 12: Persistência com Realm.io

Tips & Tricks - ModelosTodos 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.

Page 13: Persistência com Realm.io

Tips & Tricks - ModelosNome 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.

Page 14: Persistência com Realm.io

Transações

Page 15: Persistência com Realm.io

TransaçõesRealm 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

Page 16: Persistência com Realm.io

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.

Page 17: Persistência com Realm.io

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.

Page 18: Persistência com Realm.io

Gravando no Banco

Page 19: Persistência com Realm.io

Criando objetosUser user = realm.createObject(User.class); // Create a new objectuser.setName("John");user.setEmail("[email protected]");

User user = new User("John");user.setEmail("[email protected]");

User realmUser = realm.copyToRealm(user);

String json = ...;realm.createObjectFromJson(User.class, json);

String json = ...;realm.createOrUpdateObjectFromJson(User.class, json);

Page 20: Persistência com Realm.io

Tips & Tricks - ObjetosManipulaçã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.

Page 21: Persistência com Realm.io

Fazendo consultas

Page 22: Persistência com Realm.io

Consultas// Criando a consulta para pegar todos os usuários.RealmQuery<User> query = realm.where(User.class);

// Adiciona as condiçõesquery.equalTo("nome", "Joao");query.or().equalTo("nome", "Pedro");

// Executa a consultaRealmResults<User> resultado = query.findAll();

// Fazendo tudo juntoRealmResults<User> resultado = realm.where(User.class) .equalTo("nome", "Joao") .or() .equalTo("nome", "Pedro") .findAll();

Page 23: Persistência com Realm.io

Consultas// Agrupando Operadores LógicosRealmResults<User> resultado = realm.where(User.class) .greaterThan(“idade”, 10) .beginGroup() .equalTo("nome", "Joao") .or() .contains("nome", “Paulo") .endGroup() .findAll();

// Encadeando consultasRealmResults<User> adolescentes = realm.where(User.class) .between(“idade”, 13, 20) .findAll();

User primeiroJoao = adolescentes.where() .equalTo("nome", "Joao") .findFirst();

Page 24: Persistência com Realm.io

Consultas// Funções de agregaçãolong 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 resultadoRealmResults<User> result = realm.where(User.class).findAll();result.sort("idade"); // Sort ascendingresult.sort(""idade", RealmResults.SORT_ORDER_DESCENDING);

// Ordenando já na consultaRealmResults<User> result = realm.where(User.class).findAllSorted("idade");

Page 25: Persistência com Realm.io

Consultaspublic 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();

Page 26: Persistência com Realm.io

Tips & Tricks - ConsultasCuidado 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.

Page 27: Persistência com Realm.io

Removendo da Base

Page 28: Persistência com Realm.io

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();

Page 29: Persistência com Realm.io

Utilitários

Integrando com a Aplicação

Page 30: Persistência com Realm.io

Utilitários

Notificações

Migrações

Criptografia

RealmBaseAdapter

Page 31: Persistência com Realm.io

Integração com outras bibliotecas

Parceler

Robolectric

Page 32: Persistência com Realm.io

Geral

Page 33: Persistência com Realm.io

Tips & Tricks - Geralpublic 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; } }}

Page 34: Persistência com Realm.io

Tips & Tricks - GeralCuidado com a transição entre Threads, principalmente se você faz operações em Background.

Page 35: Persistência com Realm.io

Dúvidas?

Pedro Salomão @ppgsalomao

Page 36: Persistência com Realm.io

Obrigado!

Estamos contratando!

Pedro Salomão @ppgsalomao

[email protected] / [email protected]