Nuevo en la versión 1.10.0.
Si tiene una aplicación móvil o cliente que genera un gran volumen de datos y desea transmitirlos a MongoDB Atlas, puede sincronizar los datos unidireccionalmente mediante Sincronización de Dispositivos. Esta función se denomina Ingesta de Datos.
Puedes utilizar Ingesta de datos para transmitir datos desde la aplicación cliente a una aplicación Atlas App Services habilitada para Flexible Sync.
Es posible que desee sincronizar datos unidireccionalmente en aplicaciones de IoT, como un sensor meteorológico que envía datos a la nube. La ingesta de datos también es útil para escribir otros tipos de datos inmutables donde no se requiere resolución de conflictos, como la creación de facturas desde una aplicación de comercio electrónico o el registro de eventos de la aplicación.
La ingesta de datos está optimizada para proporcionar mejoras de rendimiento para cargas de trabajo pesadas de solo inserción del lado del cliente.
La ingesta dedatos requiere sincronización flexible.
Objetos asimétricos
El SDK de Kotlin proporciona un tipo especial de objeto Realm para usar con la ingesta de datos: un objeto asimétrico.
Los objetos asimétricos admiten ampliamente los mismos tipos de propiedades que RealmObject, con algunas excepciones:
Los objetos asimétricos solo se pueden usar en dominios sincronizados configurados con Sincronización Flexible. Sin embargo, no se pueden crear suscripciones a objetos asimétricos.
Un
AsymmetricRealmObjectpuede contenerEmbeddedRealmObjecttipos, pero no puede contenerRealmObjecttipos u otrosAsymmetricRealmObjecttipos.AsymmetricRealmObjectLos tipos no se pueden utilizar como propiedades en otros objetos de Realm.
Además, los objetos asimétricos no funcionan igual que otros objetos de Realm. No se puede agregar, leer, actualizar ni eliminar un objeto asimétrico del reino. Solo se puede crear un objeto asimétrico, que se sincroniza unidireccionalmente con la base de datos Atlas vinculada a la aplicación mediante Device Sync. Realm elimina este objeto después de la sincronización.
Tip
Objetos asimétricos y no asimétricos en el mismo ámbito
El SDK de Kotlin permite trabajar con objetos asimétricos y no asimétricos de Realm (tiposRealmObject EmbeddedRealmObject y) dentro del mismo realm. Incluya todos los objetos en la configuración de sincronización al abrir el realm. Sin embargo,no puede suscribirse a los objetos asimétricos.
Sincronizar datos unidireccionalmente desde una aplicación cliente
Definir un objeto asimétrico
Puedes sincronizar datos unidireccionalmente cuando ese objeto es AsymmetricRealmObject un. Define un objeto asimétrico implementando la interfaz AsymmetricRealmObject:
// Implements the `AsymmetricRealmObject` interface class WeatherSensor : AsymmetricRealmObject { var id: ObjectId = ObjectId() var deviceId: String = "" var temperatureInFarenheit: Float = 0.0F var barometricPressureInHg: Float = 0.0F var windSpeedInMph: Int = 0 }
Conectarse y autenticarse con una aplicación de servicios de aplicaciones
Para transmitir datos desde el cliente a su aplicación backend, debe conectarse a un backend de App Services y autenticar a un usuario.
val app = App.create(YOUR_APP_ID) val user = app.login(credentials)
La ingesta de datos es una función de Flexible Sync, por lo que la aplicación a la que te conectas debe usar Flexible Sync.
Abrir un reino
Una vez que tenga un usuario autenticado, puede abrir un dominio sincronizado mediante una configuración de sincronización. Especifique los AsymmetricRealmObject tipos que desea sincronizar.
val config = SyncConfiguration.create(user, setOf(WeatherSensor::class)) val realm = Realm.open(config) Log.v("Successfully opened realm: ${realm.configuration.name}")
A diferencia de la sincronización bidireccional, la ingesta de datos no utiliza una suscripción de sincronización flexible. Si tiene objetos no asimétricos en el mismo dominio, puede agregar una consulta de suscripción de sincronización flexible solo para esos objetos.
Crear objetos asimétricos
Una vez que tenga un reino abierto, puede crear un AsymmetricRealmObject dentro de una transacción de escritura utilizando el método de extensión insert():
// Open a write transaction realm.write { // Create a new asymmetric object val weatherSensor = WeatherSensor().apply { deviceId = "WX1278UIT" temperatureInFarenheit = 6.7F barometricPressureInHg = 29.65F windSpeedInMph = 2 } // Insert the object into the realm with the insert() extension method insert(weatherSensor) // WeatherSensor object is inserted into the realm, then synced to the // App Services backend. You CANNOT access the object locally because it's // deleted from the local realm after sync is complete. }
No se pueden leer estos objetos. Una vez creados, se sincronizan con el backend de App Services y la base de datos Atlas vinculada.
Atlas Device Sync gestiona completamente el ciclo de vida de estos datos. Se mantiene en el dispositivo hasta que la sincronización de Data Ingest se completa y luego se elimina del dispositivo.