Puede configurar un reino para sincronizar automáticamente datos entre muchos dispositivos que tengan cada uno su propia copia local de los datos.
Para obtener más información sobre los reinos sincronizados, incluidas las instrucciones sobre cómo configurar la sincronización en una aplicación de App Services, consulte Descripción general de sincronización de dispositivos Atlas.
Para obtener más información sobre las diferentes configuraciones de reino, consulte Configurar un reino.
Requisitos previos
Antes de configurar un reino con Flexible Sync en una aplicación React Native:
Habilite la sincronización flexible en el backend. Debe configurar la sincronización flexible en el backend para poder usarla con su aplicación cliente.
Autenticar un usuario en su proyecto cliente.
Configurar un reino sincronizado
Configurar un reino sincronizado usando los proveedores de @realm/react.
Por defecto, Realm sincroniza todos los datos del servidor antes de devolver cualquier dato. Si quieres sincronizar datos en segundo plano, lee Configure un Realm Sincronizado mientras está sin conexión.
Para configurar un reino sincronizado:
Importar proveedores
@realm/reactdesde.Configurar
AppProvider.Configure
UserProvidery anídelo dentro deAppProvider.Configure
RealmProviderpara la sincronización y anímelo dentro deUserProvider. Debe configurar una suscripción de sincronización. El siguiente ejemplo utiliza una suscripción inicial, pero también puede configurar suscripciones enRealmProvidercomponentes secundarios.
Así es como se anidan los proveedores:
import React from 'react'; import {AppProvider, UserProvider, RealmProvider} from '@realm/react'; function AppWrapperSync() { return ( <AppProvider id={APP_ID}> <UserProvider fallback={LogIn}> <RealmProvider schema={[YourObjectModel]} sync={{ flexible: true, initialSubscriptions: { update(subs, realm) { subs.add(realm.objects(YourObjectModel)); }, }, }}> <RestOfApp /> </RealmProvider> </UserProvider> </AppProvider> ); }
Nota
Sincronización basada en particiones
Esta página describe los dominios de sincronización flexible. Esta sincronización es el modo preferido para las nuevas aplicaciones que usan Atlas Device Sync. Para obtener información sobre los dominios que usan la sincronización basada en particiones, consulte Sincronización basada en particiones.
Proveedor de aplicaciones
El @realm/react AppProvider le brinda acceso a una instancia de su aplicación App Services.
Para configurar el cliente de la aplicación, pase la cadena de ID de la aplicación a la propiedad id de AppProvider. Envuelva los componentes que necesiten acceder a la aplicación con AppProvider.
import React from 'react'; import {AppProvider} from '@realm/react'; function AppWrapper() { return ( <View> <AppProvider id={APP_ID}> <MyApp /> </AppProvider> </View> ); }
Puede encontrar más información sobre AppProvider en la página Conectarse a los servicios de la aplicación Atlas.
Proveedor de usuarios
UserProvider te da acceso a un usuario de Realm.UserProvider Se requiere un para que una aplicación use los ganchos.
Primero, debe configurar la autenticación de usuario con AppProvider y UserProvider. Luego, trabaje con la autenticación usando los ganchos useApp() y useUser().
Para configurar la autenticación de usuario:
Envuelva todos los componentes que desea utilizar con App Services en un
AppProvider.Dentro de
AppProvider, envuelva todos los componentes que necesitan acceso a un usuario autenticado con unUserProvider.En
UserProvider, incluya una propiedadfallbackcon otro componente que inicie sesión a un usuario. La aplicación representa este componente si no hay ningún usuario autenticado.En el componente pasado a la propiedad
UserProvider.fallback, autentica un usuario conRealm.App.logIn(), al que puedes acceder con el ganchouseApp().
Los componentes encapsulados por UserProvider solo se renderizan si la aplicación tiene un usuario autenticado. Estos componentes pueden acceder al usuario autenticado con el gancho useUser().
import React from 'react'; import {useApp, UserProvider, AppProvider} from '@realm/react'; import {Button} from 'react-native'; function AppWrapper() { return ( <AppProvider id={APP_ID}> {/* If there is no authenticated user, the app mounts the `fallback` component. Once the user successfully authenticates, the app unmounts the component in the `UserProvider.fallback` prop (the `LogIn` component in this example). */} <UserProvider fallback={LogIn}> {/* Components with access to the user. These components only mount if there's an authenticated user.*/} <RestOfApp /> </UserProvider> </AppProvider> ); } function LogIn() { const app = useApp(); // This example uses anonymous authentication. // However, you can use any authentication provider // to log a user in with this pattern. async function logInUser() { await app.logIn(Realm.Credentials.anonymous()); } return ( <Button title='Log In' onPress={logInUser} /> ); }
Puede encontrar más información sobre UserProvider en la página Autenticar usuarios.
Proveedor de reino
RealmProvider es un contenedor que expone un dominio a sus componentes secundarios. El dominio se configura pasando RealmProvider propiedades a.
Al renderizar RealmProvider, se abre el dominio. Esto significa que los componentes secundarios no pueden acceder al dominio si falla el renderizado.
Para configurar un reino sincronizado:
Importar proveedores
@realm/reactdesde.Configurar
AppProvider.Configure
UserProvidery anídelo dentro deAppProvider.Pase sus modelos de objetos a la propiedad
schemadeRealmProvider.Cree un objeto FlexibleSyncConfiguration.
Pase su objeto
SyncConfigurationa la propiedadsynco agregue el objeto en línea.Configure suscripciones iniciales o cree una nueva suscripción en
RealmProvidercomponentes secundarios.Agregue otras propiedades de objeto de configuración como accesorios a
RealmProviderpara configurar aún más su reino.
import React from 'react'; import {AppProvider, UserProvider, RealmProvider} from '@realm/react'; function AppWrapperSync() { return ( <AppProvider id={APP_ID}> <UserProvider fallback={LogIn}> <RealmProvider schema={[YourObjectModel]} sync={{ flexible: true, initialSubscriptions: { update(subs, realm) { subs.add(realm.objects(YourObjectModel)); }, }, }}> <RestOfApp /> </RealmProvider> </UserProvider> </AppProvider> ); }
Para obtener más información sobre cómo configurar y RealmProvider usar, consulte la página Configurar un reino.
Opciones de configuración
Puedes configurar RealmProvider estableciendo props que coincidan con las propiedades de un objeto de configuración. También puedes establecer los props fallback y realmRef.
realmRef- Se usa con
useRefpara exponer el dominio configurado a procesos externos aRealmProvider. Esto puede ser útil para, por ejemplo, un respaldo tras el restablecimiento de un cliente.
fallback- Se renderiza mientras se espera la apertura del dominio. Los dominios locales suelen abrirse con la suficiente rapidez como para que la propiedad
fallbackno sea necesaria.
Abrir reino sincronizado en una ruta específica
Novedades en la realm@11.6.0 versión.
Al utilizar AppConfiguration.baseFilePath y Realm.BaseConfiguration.path, puede controlar dónde se almacenan los archivos de metadatos y de Realm en los dispositivos cliente.
Para ello, configure AppProvider.baseFilePath. Si no se configura baseFilePath, se utiliza el directorio de trabajo actual. También puede configurar RealmProvider.sync.path para mayor control.
import React from 'react'; import {AppProvider, UserProvider, RealmProvider} from '@realm/react'; function AppWrapperSync({customBaseFilePath}) { return ( <AppProvider id={APP_ID} baseFilePath={customBaseFilePath}> <UserProvider fallback={LogIn}> <RealmProvider path={customRealmPath} schema={[Profile]} sync={{ flexible: true, }}> <RestOfApp /> </RealmProvider> </UserProvider> </AppProvider> ); }
import React from 'react'; import {AppProvider, UserProvider, RealmProvider} from '@realm/react'; type AppWrapperSyncProps = { customBaseFilePath: string; }; function AppWrapperSync({customBaseFilePath}: AppWrapperSyncProps) { return ( <AppProvider id={APP_ID} baseFilePath={customBaseFilePath}> <UserProvider fallback={LogIn}> <RealmProvider path={customRealmPath} schema={[Profile]} sync={{ flexible: true, }}> <RestOfApp /> </RealmProvider> </UserProvider> </AppProvider> ); }
Si se configura baseFilePath, los metadatos siempre se almacenan en <baseFilePath>/mongodb-realm/. Si no se configura baseFilePath, se almacenan en <Realm.defaultPath>/mongodb-realm.
El lugar exacto donde se almacena tu archivo Realm puede variar según la configuración de Realm.BaseConfiguration.path:
Realm.Configuration.pathNo está configurado ybaseFilePathestá configurado. Su archivo de Realm se almacena enbaseFilePath.Realm.Configuation.pathSe establece en una ruta relativa. El archivo de Realm se almacena en relación conbaseFilePath.Realm.Configuration.pathEs una ruta absoluta. Tu archivo Realm se almacena enRealm.Configuration.path.
Acceder a un reino sincronizado sin conexión
Las siguientes subsecciones muestran cómo utilizar la sincronización en segundo plano para acceder a un realm sin conexión. Para hacer esto, usa un usuario en caché y un objeto OpenRealmBehaviorConfiguration.
Dentro de la configuración de sincronización de RealmProvider, configure los campos opcionales newRealmFileBehavior y existingRealmFileBehavior en su objeto OpenRealmBehaviorConfiguration para habilitar la sincronización en segundo plano.
Puedes abrir un realm inmediatamente con sincronización en segundo plano o después de un tiempo de espera.
Nota
El inicio de sesión inicial requiere una conexión de red
Cuando un usuario se registra en tu aplicación o inicia sesión por primera vez con una cuenta existente en un cliente, este debe tener conexión de red. Comprobar las credenciales de usuario en caché permite abrir un reino sin conexión, pero solo si el usuario ha iniciado sesión previamente con conexión.
Acceso inmediato con sincronización en segundo plano
Es posible que desee sincronizar los cambios en segundo plano para mostrar datos parciales al usuario mientras el dominio sincronizado descarga datos del servidor, lo que evita que la experiencia del usuario se vea bloqueada. Recomendamos sincronizar los cambios en segundo plano para las aplicaciones en las que el dispositivo del usuario pueda desconectarse. Para sincronizar los cambios en segundo plano, abra un dominio sincronizado sincrónicamente.
import React from 'react'; import {AppProvider, UserProvider, RealmProvider} from '@realm/react'; function AppWrapperOfflineSync() { const realmAccessBehavior = { type: 'openImmediately', }; return ( <AppProvider id={APP_ID}> <UserProvider fallback={LogIn}> <RealmProvider schema={[Profile]} sync={{ flexible: true, newRealmFileBehavior: realmAccessBehavior, existingRealmFileBehavior: realmAccessBehavior, }}> <RestOfApp /> </RealmProvider> </UserProvider> </AppProvider> ); }
import React from 'react'; import {AppProvider, UserProvider, RealmProvider} from '@realm/react'; function AppWrapperOfflineSync() { const realmAccessBehavior: Realm.OpenRealmBehaviorConfiguration = { type: Realm.OpenRealmBehaviorType.OpenImmediately, }; return ( <AppProvider id={APP_ID}> <UserProvider fallback={LogIn}> <RealmProvider schema={[Profile]} sync={{ flexible: true, newRealmFileBehavior: realmAccessBehavior, existingRealmFileBehavior: realmAccessBehavior, }}> <RestOfApp /> </RealmProvider> </UserProvider> </AppProvider> ); }
Acceso después del tiempo de espera con sincronización en segundo plano
Si desea sincronizar datos, pero se encuentra en un entorno donde no se sabe con certeza si el usuario tiene conexión a Internet, especifique timeOut. Esto abre automáticamente el dominio cuando:
transcurre el tiempo de espera.
El reino se ha descargado completamente.
Si el reino no termina de descargarse antes del tiempo de espera, la sincronización inicial continúa en segundo plano.
import React from 'react'; import {AppProvider, UserProvider, RealmProvider} from '@realm/react'; function AppWrapperTimeoutSync() { const realmAccessBehavior = { type: 'downloadBeforeOpen', timeOutBehavior: 'openLocalRealm', timeOut: 1000, }; return ( <AppProvider id={APP_ID}> <UserProvider fallback={LogIn}> <RealmProvider schema={[Profile]} sync={{ flexible: true, newRealmFileBehavior: realmAccessBehavior, existingRealmFileBehavior: realmAccessBehavior, }}> <RestOfApp /> </RealmProvider> </UserProvider> </AppProvider> ); }
import React from 'react'; import {AppProvider, UserProvider, RealmProvider} from '@realm/react'; function AppWrapperTimeoutSync() { const realmAccessBehavior: Realm.OpenRealmBehaviorConfiguration = { type: 'downloadBeforeOpen', timeOutBehavior: 'openLocalRealm', timeOut: 1000, }; return ( <AppProvider id={APP_ID}> <UserProvider fallback={LogIn}> <RealmProvider schema={[Profile]} sync={{ flexible: true, newRealmFileBehavior: realmAccessBehavior, existingRealmFileBehavior: realmAccessBehavior, }}> <RestOfApp /> </RealmProvider> </UserProvider> </AppProvider> ); }
Proveedores y ganchos de @realm/react
@realm/react Cuenta con proveedores de contexto y enlaces que simplifican el trabajo con el dominio sincronizado y sus datos. Consulta la página de cada proveedor para obtener más información sobre ellos y sus enlaces.