Docs Menu
Docs Home
/ /
Sincronizar datos

Configurar y abrir un dominio sincronizado - .NET SDK

Puedes configurar un dominio para que sincronice automáticamente datos entre varios dispositivos, cada uno con su propia copia local. Los dominios sincronizados utilizan una configuración diferente a la de los dominios locales y requieren un backend de Atlas App Services para gestionar el proceso de sincronización.

Las aplicaciones siempre pueden crear, modificar y eliminar objetos de dominio sincronizados localmente, incluso sin conexión. Siempre que haya una conexión de red disponible, el SDK de dominio abre una conexión con un servidor de aplicaciones y sincroniza los cambios con y desde otros clientes. El protocolo Atlas Device Sync y las transformaciones operativas del lado del servidor garantizan que todas las instancias totalmente sincronizadas de un reino vean exactamente los mismos datos, incluso si algunos cambios ocurrieron sin conexión y/o se recibieron fuera de orden.

Tip

Aprenda a configurar y utilizar la sincronización

Para obtener más información sobre la sincronización de dispositivos, incluidas instrucciones sobre cómo configurar la sincronización en una aplicación de App Services, consulte Sincronizar datos entre dispositivos - .NET SDK.

Los reinos sincronizados se diferencian de los reinos locales no sincronizados en un par de formas:

  • Los reinos sincronizados intentan sincronizar los cambios con su aplicación de servicios de aplicaciones de backend, mientras que los reinos no sincronizados no lo hacen.

  • Los usuarios autenticados pueden acceder a los reinos sincronizados, mientras que los reinos no sincronizados no tienen concepto de usuarios ni autenticación.

Puedes copiar datos de un reino no sincronizado a un reino sincronizado, y viceversa, pero no puedes sincronizar un reino no sincronizado.

Para convertir un dominio no sincronizado en uno sincronizado, puede seguir el proceso descrito en "Migrar una aplicación solo local a una aplicación sincronizada". El SDK de .NET también proporciona el método WriteCopy(), que permite duplicar los datos de un dominio no sincronizado en uno sincronizado. Para obtener más información, consulte "Migrar de dominios no sincronizados a dominios sincronizados".

Nota

Solo sincronización basada en particiones

Este método solo admite la conversión entre un dominio sin sincronización y la sincronización basada en particiones. Si tu aplicación usa la sincronización flexible, debes iterar manualmente los objetos de un dominio y copiarlos al otro.

Para abrir un dominio sincronizado, debe tener un objeto de usuario autenticado. Para obtener una inicial User Por ejemplo, debe autenticarse en el backend de Atlas App Services, lo que requiere que el dispositivo esté en línea la primera vez que un usuario inicia sesión. Una vez que se ha producido la autenticación inicial, puede recuperar un usuario existente mientras está desconectado.

Nota

La primera vez que un usuario inicia sesión en tu aplicación, debes abrir el dominio de forma asíncrona para sincronizar los datos del servidor con el dispositivo en un hilo en segundo plano. Tras la sincronización inicial, puedes abrir un dominio de forma síncrona para garantizar que la aplicación funcione sin conexión.

El flujo típico para abrir un reino sincronizado implica:

  1. Autenticando al usuario.

  2. Creando una configuración de sincronización.

  3. Abriendo el reino sincronizado del usuario con la configuración.

Durante la autenticación, almacenamos en caché las credenciales del usuario en un archivo sync_metadata.realm en el dispositivo.

Cuando abres un reino sincronizado después de autenticarte, puedes omitir el flujo de inicio de sesión e ir directamente a abrir el reino sincronizado, utilizando la misma configuración de sincronización que ya creaste.

Con credenciales almacenadas en caché, puedes:

  • Abra inmediatamente un dominio sincronizado con los datos del dispositivo. Puede usar este método con o sin conexión.

  • Abra un reino sincronizado después de descargar los cambios desde su aplicación. Esto requiere que el usuario tenga una conexión a Internet activa.

Los pasos para abrir un reino sincronizado mientras estás en línea son:

  1. El código de su aplicación guía al usuario a través del proceso de autenticación.

  2. Crea un objeto FlexibleSyncConfiguration que incluya el objeto Usuario.

  3. Abra un reino sincronizado llamando al método GetInstanceAsync().

  4. Si su FlexibleSyncConfiguration no contenía suscripciones iniciales, agregue una suscripción.

El siguiente código demuestra estos pasos:

var app = App.Create("myRealmAppId");
var user = await app.LogInAsync(Credentials.Anonymous());
Realm realm;
var config = new FlexibleSyncConfiguration(user)
{
PopulateInitialSubscriptions = (realm) =>
{
var allTasks = realm.All<MyTask>();
realm.Subscriptions.Add(allTasks, new SubscriptionOptions { Name = "allTasks" });
}
};
try
{
realm = await Realm.GetInstanceAsync(config);
}
catch (Exception ex)
{
Console.WriteLine($@"Error creating or opening the
realm file. {ex.Message}");
}

En el ejemplo anterior, el código muestra cómo abrir el dominio de forma asincrónica llamando GetInstanceAsync() a. También puede abrir un dominio de forma sincrónica llamando al método GetInstance():

var synchronousRealm = Realm.GetInstance(config);

Una vez que un usuario se autentica, el User objeto permanece en el dispositivo hasta que cierra sesión. Esto permite que tu app recupere un usuario existente y abra un dominio sincronizado sin conexión. El SDK sincronizará los cambios que se produzcan sin conexión una vez que el dispositivo se vuelva a conectar a tu app.

El siguiente código muestra cómo comprobar si existe un objeto User. Si no se encuentra ninguno, se utiliza el proceso descrito anteriormente para obtener un usuario. Si el dispositivo ya tiene un user, se abre el dominio sincronizado con ese usuario:

var app = App.Create("myRealmAppId");
Realms.Sync.User user;
FlexibleSyncConfiguration config;
Realm realm;
if (app.CurrentUser == null)
{
// App must be online for user to authenticate
user = await app.LogInAsync(Credentials.Anonymous());
config = new FlexibleSyncConfiguration(user);
realm = Realm.GetInstance(config);
// Go on to add or update subscriptions and use the realm
}
else
{
// This works whether online or offline
// It requires a user to have been previously authenticated
user = app.CurrentUser;
config = new FlexibleSyncConfiguration(user);
realm = Realm.GetInstance(config);
// Go on to add or update subscriptions and use the realm
}

Para un control detallado de la conexión de su aplicación, puede configurar SyncTimeoutOptions en el objeto AppConfiguration. Puede configurar las siguientes propiedades de tiempo de espera de sincronización:

  • ConnectTimeout:la cantidad de tiempo necesaria para que una conexión se establezca por completo.

  • ConnectionLingerTime:la cantidad de tiempo que se debe mantener abierta una conexión después de que se hayan abandonado todas las sesiones.

  • PingKeepAlivePeriod:la cantidad de tiempo entre cada mensaje de ping de latido

  • PongKeepAliveTimeout:la cantidad de tiempo que se debe esperar una respuesta a un ping de latido antes de concluir que la conexión se ha interrumpido.

  • FastReconnectLimit: el tiempo transcurrido desde la pérdida de una conexión anterior para que una nueva conexión se considere una "reconexión rápida".

AppConfiguration configuration = new AppConfiguration("myRealmAppId")
{
SyncTimeoutOptions = new SyncTimeoutOptions()
{
ConnectTimeout = TimeSpan.FromMinutes(2),
ConnectionLingerTime = TimeSpan.FromSeconds(30),
PingKeepAlivePeriod = TimeSpan.FromMinutes(1),
PongKeepAliveTimeout = TimeSpan.FromMinutes(1),
FastReconnectLimit = TimeSpan.FromMinutes(1),
},
};

La instancia de realm implementa IDisposable para garantizar la liberación de recursos nativos. Debe desechar un objeto de realm inmediatamente después de su uso, especialmente en subprocesos en segundo plano. La forma más sencilla de hacerlo es declarar el objeto de realm con una instrucción using o encapsular el código que interactúa con un realm en una instrucción using (...):

config = new PartitionSyncConfiguration("myPart", user);
using (var realm = Realm.GetInstance(config))
{
var allItems = realm.All<Item>();
}

Si necesita que un objeto de reino se comparta fuera de un solo método, asegúrese de administrar su estado llamando al método Dispose():

realm.Dispose();

Nota

Como regla general, solo debe eliminar el dominio en subprocesos en segundo plano, ya que eliminar un dominio invalida todos los objetos asociados a esa instancia. Si está vinculando los objetos del dominio en el subproceso principal, por ejemplo, no debe llamar a Dispose().

De forma predeterminada, todas las RealmObject clases se almacenan en un dominio. En algunos casos, puede que desee limitar las clases que se almacenan, lo cual puede hacer con la propiedad Schema del RealmConfiguration objeto. El siguiente código muestra cómo especificar dos clases que desea almacenar en el dominio:

var config = new RealmConfiguration()
{
Schema = new Type[]
{
typeof(AClassWorthStoring),
typeof(AnotherClassWorthStoring)
}
};

Volver

Agregar sincronización a una aplicación

En esta página