Los SDK de dispositivos Atlas están obsoletos. Consulte Página de desuso para más detalles.
Nota
¿Qué es el SDK de Kotlin?
El SDK de Kotlin es un nuevo SDK de cliente de Realm desarrollado íntegramente con el lenguaje de programación Kotlin. Utiliza una base de código completamente diferente a la del SDK de Java. Está diseñado específicamente para aprovechar las funciones del lenguaje Kotlin, como las corrutinas y las funciones de suspensión. El SDK de Java también es compatible con algunas de estas funciones, así como con aplicaciones de Android escritas en Kotlin. Sin embargo, el SDK de Kotlin es más propio de Kotlin que el SDK de Java.
Overview
El SDK de Java y el SDK de Kotlin difieren en muchos aspectos. En esta página, encontrará una comparación detallada de la mayoría de las diferencias entre los SDK.
Arquitectura del SDK de Kotlin
El SDK de Java proporcionaba objetos, consultas y dominios activos que se actualizaban automáticamente al cambiar los datos subyacentes. El SDK de Kotlin aún proporciona esta interfaz activa en las transacciones de escritura, pero por lo demás se basa en una nueva arquitectura congelada que facilita el trabajo con objetos de dominio. Estas son algunas de las principales diferencias entre la arquitectura del SDK de Java y la del SDK de Kotlin:
Congelados por defecto: Todos los objetos están ahora congelados. A diferencia de los objetos activos, los objetos congelados no se actualizan automáticamente tras las escrituras en la base de datos. Aún se puede acceder a objetos activos dentro de una transacción de escritura, pero al pasar un objeto activo fuera de una transacción de escritura, se congela el objeto.
Seguridad de subprocesos: todas las instancias del reino, objetos, resultados de consultas y colecciones ahora se pueden transferir a través de subprocesos.
El SDK de Java detecta automáticamente los modelos de objetos de dominio definidos en su aplicación y los utiliza todos en el esquema de dominios abiertos, a menos que especifique lo contrario. El SDK de Kotlin requiere que especifique manualmente los modelos de objetos de dominio que se utilizarán en el esquema de su dominio. Además:
El SDK de Kotlin no permite establecer ni acceder a un dominio predeterminado en la aplicación. Dado que ahora se pueden compartir dominios, objetos y resultados entre subprocesos, se puede usar un singleton global.
El SDK de Java usó RealmConfiguration.Builder().build() para generar instancias RealmConfiguration de. Con el SDK de Kotlin, use el método complementario RealmConfiguration.create().RealmConfiguration
El SDK de Java utilizó el método estático Realm.getInstance() para abrir un realm con una configuración específica. Con el Kotlin SDK, usa el método estático Realm.open() en su lugar.
En el SDK de Java, los modelos de objetos Realm se declaran de una de dos maneras:
ampliar RealmObject
implementar RealmModel
El SDK de Kotlin utiliza métodos predeterminados en la interfaz RealmObject. Con el SDK de Kotlin, hereda de RealmObject para declarar un modelo de objetos Realm. Las anotaciones funcionan igual que en Java para campos con propiedades especiales, como campos ignorados, claves primarias e índices.
Tanto los SDK de Java como los de Kotlin declaran relaciones a través de campos de objeto Realm:
Cara a cara
openclassChild : RealmObject() {
var frog: Frog? = null
}
publicclassChild
extendsRealmObject {
publicFrogfrog=null;
}
classChild : RealmObject {
var frog: Frog? = null
}
Uno a muchos
Con el SDK de Java, puedes definir relaciones uno a muchos con campos de tipo RealmList. El SDK de Kotlin sigue utilizando campos de tipo RealmList, pero se deben instanciar instancias de RealmList con el método complementario 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
Con el Java SDK, era necesario usar la notación @Required para hacer que las listas de elementos primitivos no pudieran ser nulas en los modelos de objetos Realm. El SDK de Kotlin hace que las listas de elementos primitivos no sean nulos de forma predeterminada. Utiliza el operador ? para permitir que una lista de elementos primitivos sea nula.
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()
}
Escribe
El SDK de Kotlin introduce nuevos nombres para los métodos que escriben en los reinos.
Asíncrono
Con el SDK de Java, se podía escribir asincrónicamente en un dominio realm.executeTransactionAsync() con. El SDK de Kotlin utiliza la función de suspensión realm.write().
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
Con el Java SDK, podrías guardar de manera sincrónica en un Realm con realm.executeTransaction(). El SDK de Kotlin utiliza realm.writeBlocking():
Existen varias diferencias entre las consultas en el SDK de Java y las consultas en el SDK de Kotlin:
Con el SDK de Java, puede consultar objetos en dominios mediante una interfaz fluida o lenguaje de consulta de dominios (RQL). El SDK de Kotlin solo utiliza RQL.
El SDK de Java utiliza realm.where() para consultar reinos, mientras que el SDK de Kotlin utiliza realm.query().
Con el SDK de Java, se podían realizar consultas asincrónicas con realmQuery.findAllAsync()realmQuery.findFirstAsync()y. En el SDK de Kotlin, se pueden realizar consultas asincrónicas con realmQuery.asFlow(). Una vez que se tenga un flujo de resultados, se puede recopilar
los resultados.
Con el SDK de Java, se podían realizar consultas sincrónicas con realmQuery.findAll()realmQuery.findFirst()y. En el SDK de Kotlin, se realizan consultas sincrónicas con realmQuery.find().
En ambos SDK, solo se pueden eliminar objetos activos. El SDK de Kotlin ofrece mutableRealm.findLatest() para acceder a una versión activa de cualquier objeto congelado. En una transacción de escritura, se pueden consultar directamente los objetos activos y eliminarlos sin findLatest() usar.
En ambos SDK, puede suscribirse para modificar las colecciones de resultados. Con el SDK de Java, puede recibir notificaciones cuando se modifiquen los resultados del dominio mediante las siguientes interfaces:
realmResults.addChangeListener()
RxJava a través de asFlowable()
Extensiones de Kotlin con toFlow()
El SDK de Kotlin reemplaza todas estas opciones con realmQuery.asFlow(). Una vez que se obtiene un flujo de resultados, se puede llamar a la función "collect" para suscribirse a los cambios. Cualquier objeto de tipo UpdatedResults emitido por el flujo representa un cambio en el 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
)
}
}
}
Enhebrado
Con el SDK de Java, los dominios, los objetos Realm y los resultados no se pueden transferir entre subprocesos. El SDK de Kotlin congela estos objetos por defecto, haciéndolos seguros para subprocesos. A diferencia de los objetos activos que utiliza el SDK de Java, los objetos congelados del SDK de Kotlin no se actualizan automáticamente cuando cambian los datos subyacentes. Con el SDK de Kotlin, debe usar notificaciones para suscribirse a las actualizaciones.
Con el SDK de Java, las migraciones eran un proceso manual. El SDK de Kotlin automatiza las migraciones, pero también ofrece acceso a una interfaz dinámica similar para realizar ajustes personalizados en la lógica de migración.
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)
¿Qué sigue?
Ahora que comprende las diferencias entre el SDK de Java y el SDK de Kotlin, consulte el resto de la documentación del SDK de Kotlin.