O Kotlin SDK é um novo SDK do cliente Realm criado inteiramente com a linguagem de programação Kotlin. O Kotlin SDK usa uma base de código totalmente diferente do Java SDK. Ele foi projetado especificamente para aproveitar os recursos da linguagem Kotlin, como corrotinas e funções de suspensão. O Java SDK também oferece suporte a alguns desses recursos, bem como a aplicativos Android escritos no Kotlin. Mas o Kotlin SDK é mais automático do que o Java SDK.
Visão geral
O Java SDK e o Kotlin SDK diferem de várias maneiras. Nesta página, você encontrará uma comparação de alto nível da maioria das maneiras que os SDKs diferem.
Arquitetura do Kotlin SDK
O Java SDK forneceu objetos ao vivo, queries e domínios que são atualizados automaticamente quando os dados subjacentes são alterados. O SDK Kotlin ainda fornece essa interface ao vivo em transações de escrita, mas depende de uma nova arquitetura congelada que torna os objetos do Realm mais fáceis de trabalhar. Aqui estão algumas das principais diferenças entre a arquitetura Java SDK e a arquitetura Kotlin SDK:
Frozen by default (Frozen por padrão): todos os objetos estão congelados. Ao contrário dos objetos ativos, os objetos congelados não são atualizados automaticamente depois que o banco de dados é gravado. Você ainda pode acessar objetos dinâmicos em uma transação de gravação, mas passar um objeto dinâmico para fora de uma transação de gravação congela o objeto.
Segurança de thread: Todas as instâncias de Realm, objetos de Realm, resultados de queries e coleções agora podem ser transferidos entre threads.
O SDK Java detecta automaticamente os modelos de objetos de Realm definidos em sua aplicação e usa todos eles no esquema de regiões abertas, a menos que você especifique o contrário. O SDK Kotlin exige que você especifique manualmente os modelos de objetos de Realm a serem usados em seu esquema de Realm. Além disso:
O Kotlin SDK não oferece a capacidade de definir e acessar um domínio padrão em seu aplicativo. Como agora você pode compartilhar realms, objetos e resultados entre threads, você pode confiar em um singleton global.
O Java SDK usou RealmConfiguration.Builder().build() para gerar instâncias de RealmConfiguration. Com o Kotlin SDK, use RealmConfiguration.create() método complementar RealmConfiguration .
O SDK Java utilizou o método estático Realm.getInstance() para abrir um domínio com uma determinada configuração. Com o Kotlin SDK, use o método Realm.open() estático.
No Java SDK, você declara modelos de objeto do Realm de duas maneiras:
ampliar RealmObject
implementar RealmModel
O Kotlin SDK usa métodos padrão na interface RealmObject . Com o Kotlin SDK, herde de RealmObject para declarar um modelo de objeto Realm. As anotações funcionam da mesma forma que em java para campos com propriedades especiais, como campos ignorados, chaves primárias e índices.
Os SDKs Java e Kotlin declaram relação por meio dos campos de objeto de Realm:
Um a um
openclassChild : RealmObject() {
var frog: Frog? = null
}
publicclassChild
extendsRealmObject {
publicFrogfrog=null;
}
classChild : RealmObject {
var frog: Frog? = null
}
Um-para-Muitos
Com o SDK Java, você pode definir relações um-para-muitos com campos do tipo RealmList. O Kotlin SDK ainda usa campos do tipo RealmList, mas você deve instanciar instâncias RealmList com o método complementar realmListOf()..
openclassKid : RealmObject() {
var frogs = RealmList<Frog>()
}
publicclassKid
extendsRealmObject {
public RealmList<Frog> frogs =
newRealmList<Frog>();
}
classKid : RealmObject {
var frogs: RealmList<Frog> =
realmListOf()
}
Tipos de esquema
Com o Java SDK, você precisava usar a anotação do @Required para fazer listas de primitivos não anuláveis em modelos de objeto de domínio. O Kotlin SDK faz listas de primitivos não anuláveis por padrão. Use o operador ? para fazer uma lista de primitivos anuláveis.
openclassCollegeStudent : RealmObject() {
@Required
var notes = RealmList<String>()
var nullableNotes = RealmList<String>()
}
publicclassCollegeStudent
extendsRealmObject {
@Required
public RealmList<String> notes =
newRealmList<String>();
public RealmList<String> nullableNotes =
newRealmList<String>();
}
classStudent : RealmObject {
var notes: RealmList<String> =
realmListOf()
var nullableNotes: RealmList<String?> =
realmListOf()
}
Escreve
O Kotlin SDK introduz novos nomes para os métodos que escrevem em domínios.
Async
Com o Java SDK, você pode gravar de forma assíncrona em um realm com realm.executeTransactionAsync(). O Kotlin SDK usa a função suspender realm.write() no lugar.
realm.executeTransactionAsync {
transactionRealm: Realm ->
val sample: Sample =
Sample()
sample.stringField = "Sven"
transactionRealm.copyToRealm(
sample
)
}
realm.executeTransactionAsync(
transactionRealm -> {
Samplesample=newSample();
sample.stringField = "Sven";
transactionRealm.copyToRealm(sample);
});
realm.write {
// this: MutableRealm
val sample = Sample()
sample.stringField = "Sven"
this.copyToRealm(sample)
}
sincronizar
Com o Java SDK, você pode gravar de forma sincronizada em um realm com realm.executeTransaction(). O Kotlin SDK usa realm.writeBlocking():
Existem várias diferenças entre as queries no Java SDK e as queries no Kotlin SDK:
Com o SDK Java, você pode consultar objetos em domínios usando uma interface fluente ou Realm Query Language (RQL). O Kotlin SDK usa apenas o RQL.
O Java SDK usa realm.where() para executar uma query sobre realms, enquanto o Kotlin SDK usa realm.query().
Com o Java SDK, você pode executar uma query de forma assíncrona com realmQuery.findAllAsync() e realmQuery.findFirstAsync(). No Kotlin SDK, consulte de forma assíncrona com realmQuery.asFlow(). Quando tiver um fluxo de resultados, você poderá coletar os resultados.
Com o Java SDK, você pode consultar de forma sincronizada com realmQuery.findAll() e realmQuery.findFirst(). No SDK do Kotlin, consulte de forma síncrona com RealmQuery.find().
Em ambos os SDKs, você só pode excluir objetos ao vivo. O Kotlin SDK fornece mutableRealm.findLatest() para acessar uma versão ativa de qualquer objeto congelado. Em uma transação por escrito, você pode consultar diretamente objetos ao vivo e excluí-los sem usar o findLatest().
Em ambos os SDKs, você pode se inscrever para alterar as coleções de resultados. Com o Java SDK, você pode receber notificações sempre que os resultados do domínio forem alterados com as seguintes interfaces:
realmResults.addChangeListener()
RxJava por meio de asFlowable()
Extensões de Kotlin com toFlow()
O Kotlin SDK substitui todas essas opções por realmQuery.asFlow(). Depois de ter um fluxo de resultados, você pode chamar a coleta para assinar as alterações. Qualquer objeto do tipo UpdatedResults emitido pelo fluxo representa uma alteração no conjunto de resultados.
realm.where(Sample::class.java)
.findAllAsync()
.addChangeListener {
samples: RealmResults<Sample>?,
changeSet: OrderedCollectionChangeSet ->
// log change description
Log.v(
"EXAMPLE",
("Results changed. " +
"change ranges: " +
Arrays.toString(
changeSet
.changeRanges
) +
", insertion ranges: " +
Arrays.toString(
changeSet
.insertionRanges
) +
", deletion ranges: " +
Arrays.toString(
changeSet
.deletionRanges
))
)
}
realm.where(Sample.class).findAllAsync()
.addChangeListener(
(samples, changeSet) -> {
// log change description
Log.v("EXAMPLE",
"Results changed. " +
"change ranges: " +
Arrays.toString(
changeSet
.getChangeRanges()) +
", insertion ranges: " +
Arrays.toString(
changeSet
.getInsertionRanges()) +
", deletion ranges: " +
Arrays.toString(
changeSet
.getDeletionRanges()));
});
// in a coroutine or a suspend function
realm.query<Sample>().asFlow().collect {
results: ResultsChange<Sample> ->
when (results) {
is InitialResults<Sample> -> {
// do nothing with the
// initial set of results
}
is UpdatedResults<Sample> -> {
// log change description
Log.v("Results changed. " +
"change ranges: " +
results.changeRanges +
", insertion ranges: " +
results.insertionRanges +
", deletion ranges: " +
results.deletionRanges
)
}
}
}
Segmentação
Com o Java SDK, os domínios, os objetos do Realm e os resultados não podem ser passados entre threads. O Kotlin SDK congela esses objetos por padrão, tornando-os seguros contra threads. Ao contrário dos objetos dinâmicos usados pelo SDK Java, os objetos congelados encontrados no SDK Kotlin não são atualizados automaticamente quando os dados subjacentes são alterados. Com o Kotlin SDK, você deve usar notificações para assinar atualizações.
Com o Java SDK, migrações foram um processo manual. O SDK Kotlin automatiza as migrações, mas também oferece acesso a uma interface dinâmica semelhante para ajustes personalizados na lógica de migração.
val config =
RealmConfiguration.Builder()
.migration { realm: DynamicRealm,
oldVersion: Long,
newVersion: Long ->
val schema: RealmSchema =
realm.schema
if (oldVersion == 0L) {
// perform schema migration
schema.get("Sample")
?.addField(
"new_field",
String::class.java
)
}
// migrate data
schema.get("Sample")
?.transform {
obj: DynamicRealmObject ->
obj.set(
"longField",
42L
)
}
}.build()
val realm: Realm =
Realm.getInstance(config)
Log.v(
"EXAMPLE",
"Successfully opened a realm: "
+ realm.path
)
RealmConfigurationconfig=
newRealmConfiguration.Builder()
.migration((realm,
oldVersion,
newVersion) -> {
RealmSchemaschema=
realm.getSchema();
if (oldVersion == 0L) {
// perform schema migration
schema.get("Sample")
.addField("new_field",
String.class);
}
// migrate data
schema.get("Sample")
.transform(obj ->
obj.set("longField",
42L));
}).build();
Realm realm;
realm = Realm.getInstance(config);
Log.v("EXAMPLE",
"Successfully opened a realm: "
+ realm.getPath());
// A Realm migration that performs
// automatic schema migration
// and allows additional custom
// migration of data.
RealmConfiguration.Builder(
schema = setOf(Sample::class))
.migration(AutomaticSchemaMigration {
context:
AutomaticSchemaMigration.MigrationContext ->
val oldRealm:
DynamicRealm =
context.oldRealm
val newRealm:
DynamicMutableRealm =
context.newRealm
// dynamic realm gives access
// to realm data
// through a generic string
// based API
context.enumerate("Sample") {
oldObject:
DynamicRealmObject,
newObject:
DynamicMutableRealmObject? ->
newObject?.set("longField",
42L)
}
})
.build()
val realm = Realm.open(config)
E agora?
Agora que você entende as diferenças entre SDK Java e Kotlin SDK, confira o restante da documentação do Kotlin SDK.