Menu Docs
Página inicial do Docs
/ /
Atlas Device SDKs

Início rápido com sincronização - Java SDK

Nesta página

  • Inicializar Realm
  • Inicialize o aplicativo
  • Definir seu modelo de objeto
  • Autenticar um usuário
  • Abrir um Realm
  • Criar, ler, atualizar e excluir objetos
  • Fique atento às mudanças
  • Desconecte
  • Exemplo completo
  • Saída

Dica

Este guia usa o Realm Mobile Sync

Este guia ajuda você a começar a usar um aplicação Android que se comunica com um backend de aplicativo. O aplicativo fornece recursos como Sync, Realm Functions e gerenciamento de usuários. Se o seu aplicação exigir apenas a funcionalidade de banco de dados de dados local, consulte o guia Início rápido (somente local) .

Esta página contém informações para integrar rapidamente o Atlas App Services ao seu aplicativo. Antes de começar, verifique se tem:

Antes de usar o Realm em seu aplicativo, você deve inicializar a biblioteca do Realm. Seu aplicativo deve inicializar o Realm apenas uma vez a cada vez que o aplicativo for executado.

Para inicializar a biblioteca Realm , forneça um Android context para a função estática Realm.init() . Você pode fornecer uma Atividade, Fragmento ou Aplicativo context para inicialização sem nenhuma diferença no comportamento. Você pode inicializar a biblioteca Realm no onCreate() método de uma subclasse de aplicação para garantir que você inicialize o Realm apenas uma vez a cada vez que o aplicação for executado.

Realm.init(this); // context, usually an Activity or Application
Realm.init(this) // context, usually an Activity or Application

Dica

Registre sua subclasse de aplicativo no manifesto do Android

Se você criar sua própria subclasse Application , deverá adicioná-la ao AndroidManifest.xml do seu aplicativo para executar sua lógica personalizada do aplicativo. Defina a propriedade android.name da definição do aplicativo do seu manifesto para garantir que o Android instancie sua subclasse Application antes de qualquer outra classe quando um usuário iniciar seu aplicativo.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mongodb.example">
<application
android:name=".MyApplicationSubclass"
...
/>
</manifest>

Para usar as funcionalidades do App Services, como autenticação e sincronização, acesse o App Services App usando seu ID do aplicativo. O ID do aplicativo está disponível na UI do App Services.

app = new App(new AppConfiguration.Builder(appID)
.build());
val appID : String = YOUR_APP_ID;
app = App(AppConfiguration.Builder(appID)
.build())

Observação

Erros do Android Studio?

Se o Android Studio não reconhecer os tipos Realm, App ou AppConfiguration , pode haver um problema com a configuração de construção do seu Gradle. Para corrigir o problema:

  • Limpe seu projeto com Build > Clean Project

  • Reconstrua seu projeto com base em seu arquivo build.gradle atualizado com Build > Rebuild Project

  • Revisite o guia Instalar o Java SDK para se certificar de que instalou as dependências corretamente.

O Modelo de dados Realm da sua aplicação define a estrutura de dados armazenados no Realm e sincronizados de e para o App Services. Você pode definir o Modelo de dados Realm da sua aplicação de duas maneiras:

Este início rápido usa a última abordagem, que define seu esquema usando classes no código do aplicação móvel. Para definir o modelo de objetos do seu aplicativo dessa forma, você precisa habilitar o Modo de desenvolvimento.

Depois de habilitar o modo de desenvolvimento, adicione as seguintes definições de classe ao código da aplicação:

import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import io.realm.annotations.RealmClass;
import io.realm.annotations.Required;
import org.bson.types.ObjectId;
public class Task extends RealmObject {
@PrimaryKey
private ObjectId _id = new ObjectId();
private String name = "Task";
@Required
private String status = TaskStatus.Open.name();
public void setStatus(TaskStatus status) {
this.status = status.name();
}
public String getStatus() {
return this.status;
}
public ObjectId get_id() {
return _id;
}
public void set_id(ObjectId _id) {
this._id = _id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Task(String _name) {
this.name = _name;
}
public Task() {}
}
public enum TaskStatus {
Open("Open"),
InProgress("In Progress"),
Complete("Complete");
String displayName;
TaskStatus(String displayName) {
this.displayName = displayName;
}
}
enum class TaskStatus(val displayName: String) {
Open("Open"),
InProgress("In Progress"),
Complete("Complete"),
}
open class Task(_name: String = "Task", project: String = "My Project") : RealmObject() {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = _name
@Required
var status: String = TaskStatus.Open.name
var statusEnum: TaskStatus
get() {
// because status is actually a String and another client could assign an invalid value,
// default the status to "Open" if the status is unreadable
return try {
TaskStatus.valueOf(status)
} catch (e: IllegalArgumentException) {
TaskStatus.Open
}
}
set(value) { status = value.name }
}

Depois de ativar a autenticação anônima na interface do usuário do App Services, os usuários podem fazer login imediatamente no seu aplicativo sem fornecer nenhuma informação de identificação:

Credentials credentials = Credentials.anonymous();
app.loginAsync(credentials, result -> {
if (result.isSuccess()) {
Log.v("QUICKSTART", "Successfully authenticated anonymously.");
User user = app.currentUser();
String partitionValue = "My Project";
SyncConfiguration config = new SyncConfiguration.Builder(
user,
partitionValue)
.build();
uiThreadRealm = Realm.getInstance(config);
addChangeListenerToRealm(uiThreadRealm);
FutureTask<String> task = new FutureTask(new BackgroundQuickStart(app.currentUser()), "test");
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.execute(task);
} else {
Log.e("QUICKSTART", "Failed to log in. Error: " + result.getError());
}
});
val credentials: Credentials = Credentials.anonymous()
app.loginAsync(credentials) {
if (it.isSuccess) {
Log.v("QUICKSTART", "Successfully authenticated anonymously.")
val user: User? = app.currentUser()
val partitionValue: String = "My Project"
val config = SyncConfiguration.Builder(user, partitionValue)
.build()
uiThreadRealm = Realm.getInstance(config)
addChangeListenerToRealm(uiThreadRealm)
val task : FutureTask<String> = FutureTask(BackgroundQuickStart(app.currentUser()!!), "test")
val executorService: ExecutorService = Executors.newFixedThreadPool(2)
executorService.execute(task)
} else {
Log.e("QUICKSTART", "Failed to log in. Error: ${it.error}")
}
}

O Realm oferece muitas maneiras adicionais de autenticar, registrar e vincular usuários.

Depois de ativar a sincronização e autenticar um usuário, você pode abrir um Realm sincronizado. Use SyncConfiguration para controlar as especificidades de como seu aplicação sincroniza dados com o App Services, incluindo tempos limite, leituras e gravações síncronas no thread da interface do usuário e muito mais.

String partitionValue = "My Project";
SyncConfiguration config = new SyncConfiguration.Builder(
user,
partitionValue)
.build();
Realm backgroundThreadRealm = Realm.getInstance(config);
val partitionValue: String = "My Project"
val config = SyncConfiguration.Builder(user, partitionValue)
.build()
val backgroundThreadRealm : Realm = Realm.getInstance(config)

Depois de abrir um Realm, você pode modificar os objetos dentro desse Realm em um bloco de transação de gravação .

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 do aplicativo usando transações 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() {
@Override
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.")
}
})

Para criar um novo Task, instancie uma instância da classe Task e adicione-a ao domínio em um bloco de gravação:

Task task = new Task("New Task");
backgroundThreadRealm.executeTransaction (transactionRealm -> {
transactionRealm.insert(task);
});
val task : Task = Task("New Task", partitionValue)
backgroundThreadRealm.executeTransaction { transactionRealm ->
transactionRealm.insert(task)
}

Você pode recuperar uma coleção ativa de todos os itens no Realm:

// all tasks in the realm
RealmResults<Task> tasks = backgroundThreadRealm.where(Task.class).findAll();
// all tasks in the realm
val tasks : RealmResults<Task> = backgroundThreadRealm.where<Task>().findAll()

Você também pode filtrar essa coleção usando um filtro:

// you can also filter a collection
RealmResults<Task> tasksThatBeginWithN = tasks.where().beginsWith("name", "N").findAll();
RealmResults<Task> openTasks = tasks.where().equalTo("status", TaskStatus.Open.name()).findAll();
// you can also filter a collection
val tasksThatBeginWithN : List<Task> = tasks.where().beginsWith("name", "N").findAll()
val openTasks : List<Task> = tasks.where().equalTo("status", TaskStatus.Open.name).findAll()

Para modificar uma tarefa, atualize suas propriedades em um bloco de transação de escrita:

Task otherTask = tasks.get(0);
// all modifications to a realm must happen inside of a write block
backgroundThreadRealm.executeTransaction( transactionRealm -> {
Task innerOtherTask = transactionRealm.where(Task.class).equalTo("_id", otherTask.get_id()).findFirst();
innerOtherTask.setStatus(TaskStatus.Complete);
});
val otherTask: Task = tasks[0]!!
// all modifications to a realm must happen inside of a write block
backgroundThreadRealm.executeTransaction { transactionRealm ->
val innerOtherTask : Task = transactionRealm.where<Task>().equalTo("_id", otherTask._id).findFirst()!!
innerOtherTask.status = TaskStatus.Complete.name
}

Por fim, você pode excluir uma tarefa chamando o método deleteFromRealm() em um bloco de transação de gravação :

Task yetAnotherTask = tasks.get(0);
ObjectId yetAnotherTaskId = yetAnotherTask.get_id();
// all modifications to a realm must happen inside of a write block
backgroundThreadRealm.executeTransaction( transactionRealm -> {
Task innerYetAnotherTask = transactionRealm.where(Task.class).equalTo("_id", yetAnotherTaskId).findFirst();
innerYetAnotherTask.deleteFromRealm();
});
val yetAnotherTask: Task = tasks.get(0)!!
val yetAnotherTaskId: ObjectId = yetAnotherTask._id
// all modifications to a realm must happen inside of a write block
backgroundThreadRealm.executeTransaction { transactionRealm ->
val innerYetAnotherTask : Task = transactionRealm.where<Task>().equalTo("_id", yetAnotherTaskId).findFirst()!!
innerYetAnotherTask.deleteFromRealm()
}

Você pode assistir a um Realm, coleção ou objeto para alterações anexando um OrderedRealmCollectionChangeListener personalizado com o método addChangeListener() :

// all tasks in the realm
RealmResults<Task> tasks = uiThreadRealm.where(Task.class).findAllAsync();
tasks.addChangeListener(new OrderedRealmCollectionChangeListener<RealmResults<Task>>() {
@Override
public void onChange(RealmResults<Task> collection, OrderedCollectionChangeSet changeSet) {
// process deletions in reverse order if maintaining parallel data structures so indices don't change as you iterate
OrderedCollectionChangeSet.Range[] deletions = changeSet.getDeletionRanges();
for (OrderedCollectionChangeSet.Range range : deletions) {
Log.v("QUICKSTART", "Deleted range: " + range.startIndex + " to " + (range.startIndex + range.length - 1));
}
OrderedCollectionChangeSet.Range[] insertions = changeSet.getInsertionRanges();
for (OrderedCollectionChangeSet.Range range : insertions) {
Log.v("QUICKSTART", "Inserted range: " + range.startIndex + " to " + (range.startIndex + range.length - 1)); }
OrderedCollectionChangeSet.Range[] modifications = changeSet.getChangeRanges();
for (OrderedCollectionChangeSet.Range range : modifications) {
Log.v("QUICKSTART", "Updated range: " + range.startIndex + " to " + (range.startIndex + range.length - 1)); }
}
});
// all tasks in the realm
val tasks : RealmResults<Task> = realm.where<Task>().findAllAsync()
tasks.addChangeListener(OrderedRealmCollectionChangeListener<RealmResults<Task>> { collection, changeSet ->
// process deletions in reverse order if maintaining parallel data structures so indices don't change as you iterate
val deletions = changeSet.deletionRanges
for (i in deletions.indices.reversed()) {
val range = deletions[i]
Log.v("QUICKSTART", "Deleted range: ${range.startIndex} to ${range.startIndex + range.length - 1}")
}
val insertions = changeSet.insertionRanges
for (range in insertions) {
Log.v("QUICKSTART", "Inserted range: ${range.startIndex} to ${range.startIndex + range.length - 1}")
}
val modifications = changeSet.changeRanges
for (range in modifications) {
Log.v("QUICKSTART", "Updated range: ${range.startIndex} to ${range.startIndex + range.length - 1}")
}
})

Uma vez logado, você pode sair:

app.currentUser().logOutAsync(result -> {
if (result.isSuccess()) {
Log.v("QUICKSTART", "Successfully logged out.");
} else {
Log.e("QUICKSTART", "Failed to log out, error: " + result.getError());
}
});
app.currentUser()?.logOutAsync() {
if (it.isSuccess) {
Log.v("QUICKSTART", "Successfully logged out.")
} else {
Log.e("QUICKSTART", "Failed to log out, error: ${it.error}")
}
}

Execute o exemplo completo substituindo o appId pelo ID do aplicativo do seu Realm. Se você estiver executando este projeto em um novo projeto do Android Studio, você pode copiar e colar este arquivo no MainActivity do seu aplicativo -- apenas lembre-se de:

  • altere a declaração do pacote para que ela corresponda ao seu projeto

  • substitua o espaço reservado do App ID pelo ID do aplicativo

  • atualize as declarações import para Task e TaskStatus se você estiver usando Java

Task.java
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import io.realm.annotations.RealmClass;
import io.realm.annotations.Required;
import org.bson.types.ObjectId;
public class Task extends RealmObject {
@PrimaryKey
private ObjectId _id = new ObjectId();
private String name = "Task";
@Required
private String status = TaskStatus.Open.name();
public void setStatus(TaskStatus status) {
this.status = status.name();
}
public String getStatus() {
return this.status;
}
public ObjectId get_id() {
return _id;
}
public void set_id(ObjectId _id) {
this._id = _id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Task(String _name) {
this.name = _name;
}
public Task() {}
}
TaskStatus.java
public enum TaskStatus {
Open("Open"),
InProgress("In Progress"),
Complete("Complete");
String displayName;
TaskStatus(String displayName) {
this.displayName = displayName;
}
}
MainActivity.java
import io.realm.OrderedCollectionChangeSet;
import org.bson.types.ObjectId;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.util.Log;
import io.realm.OrderedRealmCollectionChangeListener;
import io.realm.Realm;
import io.realm.RealmResults;
import io.realm.mongodb.App;
import io.realm.mongodb.AppConfiguration;
import io.realm.mongodb.Credentials;
import io.realm.mongodb.User;
import io.realm.mongodb.sync.SyncConfiguration;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import com.mongodb.realm.examples.model.Task;
import com.mongodb.realm.examples.model.TaskStatus;
public class MainActivity extends AppCompatActivity {
Realm uiThreadRealm;
App app;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Realm.init(this); // context, usually an Activity or Application
app = new App(new AppConfiguration.Builder(appID)
.build());
Credentials credentials = Credentials.anonymous();
app.loginAsync(credentials, result -> {
if (result.isSuccess()) {
Log.v("QUICKSTART", "Successfully authenticated anonymously.");
User user = app.currentUser();
String partitionValue = "My Project";
SyncConfiguration config = new SyncConfiguration.Builder(
user,
partitionValue)
.build();
uiThreadRealm = Realm.getInstance(config);
addChangeListenerToRealm(uiThreadRealm);
FutureTask<String> task = new FutureTask(new BackgroundQuickStart(app.currentUser()), "test");
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.execute(task);
} else {
Log.e("QUICKSTART", "Failed to log in. Error: " + result.getError());
}
});
}
private void addChangeListenerToRealm(Realm realm) {
// all tasks in the realm
RealmResults<Task> tasks = uiThreadRealm.where(Task.class).findAllAsync();
tasks.addChangeListener(new OrderedRealmCollectionChangeListener<RealmResults<Task>>() {
@Override
public void onChange(RealmResults<Task> collection, OrderedCollectionChangeSet changeSet) {
// process deletions in reverse order if maintaining parallel data structures so indices don't change as you iterate
OrderedCollectionChangeSet.Range[] deletions = changeSet.getDeletionRanges();
for (OrderedCollectionChangeSet.Range range : deletions) {
Log.v("QUICKSTART", "Deleted range: " + range.startIndex + " to " + (range.startIndex + range.length - 1));
}
OrderedCollectionChangeSet.Range[] insertions = changeSet.getInsertionRanges();
for (OrderedCollectionChangeSet.Range range : insertions) {
Log.v("QUICKSTART", "Inserted range: " + range.startIndex + " to " + (range.startIndex + range.length - 1)); }
OrderedCollectionChangeSet.Range[] modifications = changeSet.getChangeRanges();
for (OrderedCollectionChangeSet.Range range : modifications) {
Log.v("QUICKSTART", "Updated range: " + range.startIndex + " to " + (range.startIndex + range.length - 1)); }
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
// the ui thread realm uses asynchronous transactions, so we can only safely close the realm
// when the activity ends and we can safely assume that those transactions have completed
uiThreadRealm.close();
app.currentUser().logOutAsync(result -> {
if (result.isSuccess()) {
Log.v("QUICKSTART", "Successfully logged out.");
} else {
Log.e("QUICKSTART", "Failed to log out, error: " + result.getError());
}
});
}
public class BackgroundQuickStart implements Runnable {
User user;
public BackgroundQuickStart(User user) {
this.user = user;
}
@Override
public void run() {
String partitionValue = "My Project";
SyncConfiguration config = new SyncConfiguration.Builder(
user,
partitionValue)
.build();
Realm backgroundThreadRealm = Realm.getInstance(config);
Task task = new Task("New Task");
backgroundThreadRealm.executeTransaction (transactionRealm -> {
transactionRealm.insert(task);
});
// all tasks in the realm
RealmResults<Task> tasks = backgroundThreadRealm.where(Task.class).findAll();
// you can also filter a collection
RealmResults<Task> tasksThatBeginWithN = tasks.where().beginsWith("name", "N").findAll();
RealmResults<Task> openTasks = tasks.where().equalTo("status", TaskStatus.Open.name()).findAll();
Task otherTask = tasks.get(0);
// all modifications to a realm must happen inside of a write block
backgroundThreadRealm.executeTransaction( transactionRealm -> {
Task innerOtherTask = transactionRealm.where(Task.class).equalTo("_id", otherTask.get_id()).findFirst();
innerOtherTask.setStatus(TaskStatus.Complete);
});
Task yetAnotherTask = tasks.get(0);
ObjectId yetAnotherTaskId = yetAnotherTask.get_id();
// all modifications to a realm must happen inside of a write block
backgroundThreadRealm.executeTransaction( transactionRealm -> {
Task innerYetAnotherTask = transactionRealm.where(Task.class).equalTo("_id", yetAnotherTaskId).findFirst();
innerYetAnotherTask.deleteFromRealm();
});
// because this background thread uses synchronous realm transactions, at this point all
// transactions have completed and we can safely close the realm
backgroundThreadRealm.close();
}
}
}
MainActivity.kt
import org.bson.types.ObjectId
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import android.util.Log
import com.mongodb.realm.examples.YOUR_APP_ID
import io.realm.OrderedRealmCollectionChangeListener
import io.realm.Realm
import io.realm.RealmObject
import io.realm.RealmResults
import io.realm.annotations.PrimaryKey
import io.realm.annotations.Required
import io.realm.kotlin.where
import io.realm.mongodb.App
import io.realm.mongodb.AppConfiguration
import io.realm.mongodb.Credentials
import io.realm.mongodb.User
import io.realm.mongodb.sync.SyncConfiguration
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
import java.util.concurrent.FutureTask
class MainActivity : AppCompatActivity() {
lateinit var uiThreadRealm: Realm
lateinit var app: App
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Realm.init(this) // context, usually an Activity or Application
val appID : String = YOUR_APP_ID;
app = App(AppConfiguration.Builder(appID)
.build())
val credentials: Credentials = Credentials.anonymous()
app.loginAsync(credentials) {
if (it.isSuccess) {
Log.v("QUICKSTART", "Successfully authenticated anonymously.")
val user: User? = app.currentUser()
val partitionValue: String = "My Project"
val config = SyncConfiguration.Builder(user, partitionValue)
.build()
uiThreadRealm = Realm.getInstance(config)
addChangeListenerToRealm(uiThreadRealm)
val task : FutureTask<String> = FutureTask(BackgroundQuickStart(app.currentUser()!!), "test")
val executorService: ExecutorService = Executors.newFixedThreadPool(2)
executorService.execute(task)
} else {
Log.e("QUICKSTART", "Failed to log in. Error: ${it.error}")
}
}
}
fun addChangeListenerToRealm(realm : Realm) {
// all tasks in the realm
val tasks : RealmResults<Task> = realm.where<Task>().findAllAsync()
tasks.addChangeListener(OrderedRealmCollectionChangeListener<RealmResults<Task>> { collection, changeSet ->
// process deletions in reverse order if maintaining parallel data structures so indices don't change as you iterate
val deletions = changeSet.deletionRanges
for (i in deletions.indices.reversed()) {
val range = deletions[i]
Log.v("QUICKSTART", "Deleted range: ${range.startIndex} to ${range.startIndex + range.length - 1}")
}
val insertions = changeSet.insertionRanges
for (range in insertions) {
Log.v("QUICKSTART", "Inserted range: ${range.startIndex} to ${range.startIndex + range.length - 1}")
}
val modifications = changeSet.changeRanges
for (range in modifications) {
Log.v("QUICKSTART", "Updated range: ${range.startIndex} to ${range.startIndex + range.length - 1}")
}
})
}
override fun onDestroy() {
super.onDestroy()
// the ui thread realm uses asynchronous transactions, so we can only safely close the realm
// when the activity ends and we can safely assume that those transactions have completed
uiThreadRealm.close()
app.currentUser()?.logOutAsync() {
if (it.isSuccess) {
Log.v("QUICKSTART", "Successfully logged out.")
} else {
Log.e("QUICKSTART", "Failed to log out, error: ${it.error}")
}
}
}
class BackgroundQuickStart(val user: User) : Runnable {
override fun run() {
val partitionValue: String = "My Project"
val config = SyncConfiguration.Builder(user, partitionValue)
.build()
val backgroundThreadRealm : Realm = Realm.getInstance(config)
val task : Task = Task("New Task", partitionValue)
backgroundThreadRealm.executeTransaction { transactionRealm ->
transactionRealm.insert(task)
}
// all tasks in the realm
val tasks : RealmResults<Task> = backgroundThreadRealm.where<Task>().findAll()
// you can also filter a collection
val tasksThatBeginWithN : List<Task> = tasks.where().beginsWith("name", "N").findAll()
val openTasks : List<Task> = tasks.where().equalTo("status", TaskStatus.Open.name).findAll()
val otherTask: Task = tasks[0]!!
// all modifications to a realm must happen inside of a write block
backgroundThreadRealm.executeTransaction { transactionRealm ->
val innerOtherTask : Task = transactionRealm.where<Task>().equalTo("_id", otherTask._id).findFirst()!!
innerOtherTask.status = TaskStatus.Complete.name
}
val yetAnotherTask: Task = tasks.get(0)!!
val yetAnotherTaskId: ObjectId = yetAnotherTask._id
// all modifications to a realm must happen inside of a write block
backgroundThreadRealm.executeTransaction { transactionRealm ->
val innerYetAnotherTask : Task = transactionRealm.where<Task>().equalTo("_id", yetAnotherTaskId).findFirst()!!
innerYetAnotherTask.deleteFromRealm()
}
// because this background thread uses synchronous realm transactions, at this point all
// transactions have completed and we can safely close the realm
backgroundThreadRealm.close()
}
}
}
enum class TaskStatus(val displayName: String) {
Open("Open"),
InProgress("In Progress"),
Complete("Complete"),
}
open class Task(_name: String = "Task", project: String = "My Project") : RealmObject() {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = _name
@Required
var status: String = TaskStatus.Open.name
var statusEnum: TaskStatus
get() {
// because status is actually a String and another client could assign an invalid value,
// default the status to "Open" if the status is unreadable
return try {
TaskStatus.valueOf(status)
} catch (e: IllegalArgumentException) {
TaskStatus.Open
}
}
set(value) { status = value.name }
}

A execução do código acima deve produzir um resultado semelhante ao seguinte:

Successfully authenticated anonymously.
Updated range: 0 to 1
Deleted range: 0 to 1
Successfully logged out.

Próximo

Bem-vindo aos Docs do Atlas Device SDK