Transmitir dados para o Atlas - Kotlin SDK
Nesta página
Novidade na versão 1.10.0.
Se você tiver uma aplicação móvel ou de cliente que produz um grande volume de dados que deseja transmitir para o MongoDB Atlas, poderá sincronizar os dados unidirecionalmente usando o Realm Mobile Sync. Chamamos de Ingestão de dados o recurso que permite essa sincronização unidirecional .
Você pode usar aingestão de dados para transmitir dados do aplicação cliente para um Atlas App Services habilitado para Flexible Sync .
Talvez você queira sincronizar dados unidirecionalmente em aplicativos IoT, como um sensor meteorológico que envia dados para a nuvem. O arquivo de dados também é útil para gravar outros tipos de dados imutáveis em que você não exige a resolução de conflitos, como criar faturas a partir de uma aplicação de varejo ou registrar evento de aplicação.
A ingestão de dados é otimizada para fornecer melhorias de desempenho para volumes de trabalho pesados somente de inserção no lado do cliente.
A ingestão de dados requer Flexible Sync.
Objetos assimétricos
O Kotlin SDK fornece um tipo especial de Objeto de Realm para usar com o arquivo de dados: um objeto assimétrico.
Objeto assimétricos suportam amplamente os mesmos tipos de propriedade do RealmObject
, com algumas exceções:
Objetos assimétricos só podem ser usados em domínios sincronizados configurados com o Flexible Sync. No entanto, você não pode criar assinaturas para objetos assimétricos.
Um
AsymmetricRealmObject
pode conter tiposEmbeddedRealmObject
, mas não pode conter tiposRealmObject
ou outros tiposAsymmetricRealmObject
.AsymmetricRealmObject
os tipos não podem ser usados como propriedade em outros Objeto de Realm.
Além disso, objetos assimétricos não funcionam da mesma maneira que outros objetos do Realm . Você não pode adicionar, ler, atualizar ou excluir um objeto assimétrico do Realm. Você só pode criar um objeto assimétrico , que é sincronizado unidirecionalmente com o banco de banco de dados do Atlas vinculado ao seu aplicativo com o Device Sync. O Realm exclui esse objeto após a sincronização.
Dica
Objetos assimétricos e não assimétricos no mesmo Realm
O SDK Kotlin permite que você trabalhe com objetos assimétricos e objetos de Realm não assimétricos (tipos RealmObject
e EmbeddedRealmObject
) dentro do mesmo domínio. Inclua todos os objetos na configuração de sincronização ao abrir o realm. No entanto, você não pode assinar os objetos assimétricos.
Sincronizar dados unidirecionalmente a partir de um aplicativo do cliente
Definir um objeto assimétrico
Você pode sincronizar dados unidirecionalmente quando esse objeto é um AsymmetricRealmObject
. Defina um objeto assimétrico implementando a interface 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 }
Conecte-se e autentique-se com um App Services App
Para transmitir dados do cliente para seu aplicativo de backend, você deve conectar-se a um backend do App Services e autenticar um usuário.
val app = App.create(YOUR_APP_ID) val user = app.login(credentials)
A ingestão de dados é uma funcionalidade do Flexible Sync, portanto, o aplicativo ao qual você se conecta deve usar o Flexible Sync.
Abrir um Realm
Depois de ter um usuário autenticado, você pode abrir um Realm sincronizado usando um SyncConfiguration. Especifique os tipos AsymmetricRealmObject
que você deseja sincronizar.
val config = SyncConfiguration.create(user, setOf(WeatherSensor::class)) val realm = Realm.open(config) Log.v("Successfully opened realm: ${realm.configuration.name}")
Ao contrário da sincronização bidirecional, a ingestão de dados não usa uma assinatura de Flexible Sync . Se você tiver objetos não assimétricos no mesmo território, poderá adicionar uma query de assinatura do Flexible Sync apenas para esses objetos.
Criar objetos assimétricos
Depois de abrir um Realm, você pode criar um AsymmetricRealmObject
dentro de uma transação de escrita usando o método de extensão 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. }
Você não pode ler esses objetos. Depois de criados, eles são sincronizados com o backend do App Services e o reconhecimento de data center vinculado do Atlas.
O Atlas Device Sync gerencia o ciclo de vida desses dados por completo. Ele é mantido no dispositivo até que a sincronização da ingestão de dados seja concluída e, em seguida, é removido do dispositivo.