CRUD - Java SDK
Operações de Escrita
Você pode criar objeto em um Realm, atualizar objeto em um Realm e, eventualmente, excluir objeto de um Realm. Because these operations modify the state of the realm, we call them writes.
O Realm lida com as operações de escrita como transações. Uma transação é um conjunto de operações de leitura e escrita que o Realm trata como uma única operação indivisível. Em outras palavras, uma transação é tudo ou nada: ou todas as suas operações na transação são bem-sucedidas ou nenhuma é efetivada.
Observação
Todas as operações de gravação devem ocorrer em uma transação.
Um Realm permite apenas uma transação de escrita aberta por vez. O Realm bloqueia outras escritas em outras threads até que a transação aberta seja concluída. Consequentemente, não há condição de corrida ao ler valores do Realm dentro de uma transação.
Quando você termina a transação, o Realm ou a confirma ou a cancela :
Quando o Realm confirma uma transação, o Realm grava todas as alterações no disco. Para domínios sincronizados, o Realm classifica a alteração para sincronização com o Atlas App Services.
Quando Realm o domínio cancela transação de escrita ou uma operação na transação causa um erro, todas as alterações são descartadas (ou "revertidas").
Dica
As gravações de Objeto de Realm são gravações de arquivos
Sempre que você cria, atualiza ou exclui um objeto do Realm, suas alterações atualizam a representação desse objeto no Realm e emitem notificações para qualquer ouvinte inscrito. Como resultado, você só deve gravar em objetos de Realm quando necessário para persistir os dados.
Importante
Leituras e gravações síncronas na thread da interface do usuário
Por padrão, você só pode ler ou escrever em um Realm no thread da UI da sua aplicação usando transação assíncronas. Ou seja, você só pode usar métodos Realm
cujo nome termina com a palavra Async
no thread principal do seu aplicativo Android, a menos que você permita explicitamente o uso de métodos síncronos.
Essa restrição existe para o benefício dos usuários do aplicativo: executar operações de leitura e escrita no thread da interface do usuário pode levar a interações de interface do usuário não responsivas ou lentas, portanto, geralmente é melhor lidar com essas operações de forma assíncrona ou em um thread de fundo. No entanto, se o seu aplicativo exigir o uso de leituras ou gravações síncronas de realm no thread da interface do usuário, você poderá permitir explicitamente o uso de métodos síncronos com as seguintes opções SyncConfiguration
:
SyncConfiguration config = new SyncConfiguration.Builder(app.currentUser(), PARTITION) .allowQueriesOnUiThread(true) .allowWritesOnUiThread(true) .build(); Realm.getInstanceAsync(config, new Realm.Callback() { public void onSuccess(Realm realm) { Log.v( "EXAMPLE", "Successfully opened a realm with reads and writes allowed on the UI thread." ); } });
val config = SyncConfiguration.Builder(app.currentUser(), PARTITION) .allowQueriesOnUiThread(true) .allowWritesOnUiThread(true) .build() Realm.getInstanceAsync(config, object : Realm.Callback() { override fun onSuccess(realm: Realm) { Log.v("EXAMPLE", "Successfully opened a realm with reads and writes allowed on the UI thread.") } })
managed objeto
Objetos gerenciados são objetos de Realm ativos que são atualizados com base em alterações nos dados subjacentes no Realm. managed objeto só podem vir de um Realm aberto e receber atualizações enquanto esse Realm permanecer aberto. managed objeto não podem ser passados entre threads.
Objetos não gerenciados
Objetos não gerenciados são instâncias de objetos de Realm que não estão ativos. Você pode obter um objeto não gerenciado construindo manualmente um objeto de Realm ou chamando Realm.copyFromRealm(). Objetos não gerenciados podem ser passados entre threads.
Executar uma transação
O Realm representa cada transação como uma função de chamada de resposta que contém zero ou mais operações de leitura e gravação. Para executar uma transação, defina uma chamada de resposta e passe-a para o método write
do Realm. Dentro desta chamada de resposta, você é livre para criar, ler, atualizar e excluir no Realm. Se o código na chamada de resposta lançar uma exceção quando o Realm o executar, o Realm cancelará a transação. Caso contrário, o Realm confirma a transação imediatamente após a chamada de resposta.
Exemplo
O código a seguir mostra como executar uma transação com executeTransaction() ou executeTransactionAsync(). Se o código na chamada de resposta lançar uma exceção, o Realm cancelará a transação. Caso contrário, o Realm confirma a transação.
realm.executeTransaction(r -> { // Create a turtle enthusiast named Ali. TurtleEnthusiast ali = r.createObject(TurtleEnthusiast.class, new ObjectId()); ali.setName("Ali"); // Find turtles younger than 2 years old RealmResults<Turtle> hatchlings = r.where(Turtle.class).lessThan("age", 2).findAll(); // Give all hatchlings to Ali. hatchlings.setObject("owner", ali); });
realm.executeTransaction { r: Realm -> // Create a turtle enthusiast named Ali. val ali = r.createObject(TurtleEnthusiast::class.java, ObjectId()) ali.name = "Ali" // Find turtles younger than 2 years old val hatchlings = r.where(Turtle::class.java).lessThan("age", 2).findAll() // Give all hatchlings to Ali. hatchlings.setObject("owner", ali) }