Overview
Nuevo en la versión 10.22.0.
Flexible Sync utiliza suscripciones y permisos para determinar qué datos sincronizar con su aplicación.
Para utilizar Flexible Sync en un cliente iOS:
Autenticar un usuario en su proyecto cliente.
Abra el reino sincronizado con una configuración de sincronización flexible
Puede agregar, actualizar y eliminar suscripciones manualmente para determinar qué datos se sincronizan con el dispositivo cliente. En la versión 10.43.0 y posteriores del SDK de Realm Swift, puede suscribirse a consultas en lugar de administrar las suscripciones manualmente, o además de hacerlo.
Tip
Flexible Sync admite Combine.
Suscripciones
Cuando configura Flexible Sync en el backend, especifica qué campos puede consultar su aplicación cliente mediante suscripciones.
Cada suscripción corresponde a una consulta sobre campos consultables para un tipo de objeto específico.Consulte Campos consultables en la documentación de App Services para obtener más información.
Para cada suscripción de consulta, Realm busca datos que coincidan con la consulta. Los datos que coinciden con la suscripción, donde el usuario tiene los permisos adecuados, se sincronizan entre los clientes y la aplicación backend.
Puede construir consultas con el motor de consultas Realm Swift SDK.
Suscribirse a tipos de objetos
Los conjuntos de suscripciones se basan en el tipo de objeto. Es posible que tenga varias suscripciones si tiene varios tipos de objetos de Realm. También puede tener varias suscripciones para el mismo tipo de objeto.
Sin embargo, tenga en cuenta lo siguiente si utiliza relaciones u objetos asimétricos en su aplicación:
Enlaces de objetos
Debe agregar un objeto y su objeto vinculado al conjunto de suscripciones para ver un objeto vinculado.
Si los resultados de su suscripción contienen un objeto con una propiedad que enlaza a un objeto no incluido en los resultados, el enlace aparecerá como nulo. No hay forma de distinguir si el valor de esa propiedad es legítimamente nulo o si el objeto al que enlaza existe, pero no está visible para la suscripción de consulta.
Objetos asimétricos
Si tu aplicación utiliza Data Ingest para sincronizar objetos asimétricos de forma unidireccional, no podrás crear suscripciones para esos objetos. Si tu aplicación contiene objetos asimétricos y no asimétricos en el mismo realm, puedes añadir queries de suscripción de Flexible Sync para los objetos no asimétricos.
Permisos
Las suscripciones funcionan en conjunto con los permisos para determinar qué datos sincronizar con la aplicación cliente. La aplicación cliente solo ve el subconjunto de datos que coincide con las suscripciones y los permisos del usuario conectado.
Esta página detalla cómo administrar las suscripciones de clientes para Sincronización Flexible. Para obtener información sobre cómo configurar permisos para Sincronización Flexible, consulte: Reglas y permisos de Sincronización Flexible.
Administrar suscripciones en su aplicación cliente
En la aplicación cliente, se agregan, actualizan y eliminan suscripciones a consultas específicas en los campos consultables. Esto determina qué datos se sincronizan con el dispositivo cliente.
Puede:
Agregue suscripciones con un nombre de suscripción opcional:
En la versión 10.43.0 y posteriores del SDK de Realm Swift, puedes usar
.subscribe()Suscribirse a la consultaResults. Esto añade automáticamente la suscripción al conjunto de suscripciones.Agregue manualmente una suscripción al conjunto de suscripciones con la
subscriptionsAPI. Use esta API si necesita más control sobre las suscripciones para optimizar el rendimiento o por motivos de lógica de negocio.Consulte "Consideraciones de rendimiento" para obtener más información.
Reaccionar al estado de la suscripción
Actualizar suscripciones con nuevas consultas
Remover suscripciones individuales o todas las suscripciones de un tipo de objeto Realm.
Acerca de los ejemplos de esta página
Los ejemplos de esta página utilizan un conjunto de datos simple para una aplicación de lista de tareas. Los dos tipos de objeto Realm son Team y Task. Un Task tiene un taskName, el nombre del asignado y una marca de completado. También incluye un recuento de minutos dedicados y una fecha de vencimiento. Un Team tiene un teamName, cero o más Tasks y una lista de members.
class Task: Object { (primaryKey: true) var _id: ObjectId var taskName: String var assignee: String? var completed: Bool var progressMinutes: Int var dueDate: Date } class Team: Object { (primaryKey: true) var _id: ObjectId var teamName: String var tasks: List<Task> var members: List<String> }
Los ejemplos en esta página también suponen que tienes un usuario autorizado y una configuración de Flexible Sync:
let app = App(id: APPID) do { let credentials = emailPasswordCredentials(app: app) let user = try await app.login(credentials: credentials) var flexSyncConfig = user.flexibleSyncConfiguration() flexSyncConfig.objectTypes = [Task.self, Team.self] do { // Open the synced realm and manage Flexible Sync subscriptions } catch { print("Failed to open realm: \(error.localizedDescription)") // handle error } } catch { fatalError("Login failed: \(error.localizedDescription)") }
Suscribirse a Consultas
Novedad en la versión 10.43.0.
Para simplificar la gestión de suscripciones, la versión 10.43.0 del SDK de Realm Swift añade API para suscribirse y cancelar la suscripción al conjunto Results de una consulta. Estas API simplifican la adición y eliminación manual de suscripciones.
Importante
El .subcribe() La API está en vista previa
Las API .subscribe() y .unsubscribe() descritas aquí se encuentran actualmente en versión preliminar. Estas API podrían sufrir cambios en el futuro.
Suscribirse a una consulta
Con un usuario autenticado y una configuración de Sincronización Flexible, puede abrir un dominio sincronizado y consultar los objetos que desea leer y escribir. Puede usar la función "subscribe()" para crear una suscripción de Sincronización Flexible para los objetos que coincidan con la consulta:
let realm = try await Realm(configuration: flexSyncConfig) let results = try await realm.objects(Task.self) .where { $0.progressMinutes >= 60 }.subscribe() // Go on to work with subscribed results
Esto crea una suscripción sin nombre y la agrega MutableSubscriptionSet a, de forma similar a crear una suscripción manualmente.
Suscribirse a una consulta con un nombre de suscripción
Si su aplicación funciona con múltiples suscripciones o si desea actualizar una suscripción, es posible que desee agregar un nombre cuando se suscriba a una consulta.
Posteriormente, puedes usar este nombre para actualizar una query de suscripción, comprobar una suscripción por nombre o eliminar la query por nombre.
let realm = try await Realm(configuration: flexSyncConfig) let results = try await realm.objects(Team.self) .where { $0.teamName == "Developer Education" } .subscribe(name: "team_developer_education") // Go on to work with subscribed results
Espere a que se sincronice una suscripción de consulta
Al suscribirse al conjunto Results de una consulta, este no contiene objetos hasta que se sincroniza. Si su aplicación crea objetos, es posible que no necesite descargar los datos sincronizados antes de que el usuario pueda trabajar con ellos. Sin embargo, si su aplicación requiere datos del servidor antes de que el usuario pueda trabajar con ellos, puede especificar que una suscripción waitForSync:
let realm = try await Realm(configuration: flexSyncConfig) let results = try await realm.objects(Team.self) .where { $0.members.contains("Bob Smith") } .subscribe( name: "bob_smith_teams", waitForSync: .onCreation) // After waiting for sync, the results set contains all the objects // that match the query - in our case, 1 print("The number of teams that have Bob Smith as a member is \(results.count)")
Esta opción utiliza el enum RLMWaitForSyncMode, cuyos casos son:
.onCreation: Esperar a que se descarguen los objetos coincidentes cuando la aplicación crea la suscripción. De lo contrario, regresar sin esperar nuevas descargas. La aplicación debe tener conexión a internet la primera vez que se agrega la suscripción.
.always: Esperar a descargar los objetos coincidentes cuando se ejecuta
.subscribe(). La aplicación debe tener conexión a internet cuando se ejecuta.subscribe()..never: Nunca esperes para descargar los objetos coincidentes. La aplicación necesita conexión a internet para que el usuario se autentique la primera vez que se inicia, pero puede abrirse sin conexión en los siguientes inicios usando credenciales en caché.
Opcionalmente, puede especificar un timeout valor de tipo TimeInterval.
Darse de baja de una consulta
Puede cancelar la suscripción al conjunto de una Results consulta utilizando la API .unsubscribe():
let realm = try await Realm(configuration: flexSyncConfig) let results = try await realm.objects(Task.self).where { $0.completed == false }.subscribe() // Go on to work with subscribed results. // Later... results.unsubscribe()
Esto elimina la suscripción de, de forma MutableSubscriptionSet similar a eliminar una suscripción manualmente.
Un conjunto Results aún puede contener objetos después de llamar a .unsubscribe() si existe otra suscripción que contiene objetos superpuestos.
Llamar a .unsubscribe() no espera a que se eliminen los objetos del dominio. No hay ninguna API que espere a que .unsubscribe() se sincronice con el servidor.
Suscribirse a una consulta limitada por actores
Puede suscribirse a una consulta limitada al actor en MainActor:
let realm = try await Realm(configuration: flexSyncConfig, actor: MainActor.shared) let results = try await realm.objects(Team.self) .where { $0.teamName == "Developer Education" } .subscribe(name: "team_developer_education") // Go on to work with subscribed results
O suscríbete a una consulta sobre un actor personalizado:
let realm = try await Realm(configuration: flexSyncConfig, actor: CustomGlobalActor.shared) let results = try await realm.objects(Team.self) .where { $0.teamName == "Developer Education" } .subscribe(name: "team_developer_education") // Go on to work with subscribed results
Para obtener más información sobre los reinos limitados por actores, consulte Usar reino con actores - Swift SDK.
Gestionar suscripciones manualmente
Puede utilizar la API subscriptions para administrar manualmente un conjunto de suscripciones a consultas específicas en campos consultables.
Puede:
Añadir suscripciones
Reaccionar al estado de la suscripción
Actualizar suscripciones con nuevas consultas
Remover suscripciones individuales o todas las suscripciones de un tipo de objeto Realm.
Los datos que coinciden con la suscripción, donde el usuario tiene los permisos adecuados, se sincronizan entre los dispositivos y la aplicación backend.
Puede especificar un nombre de cadena opcional para su suscripción.
Al crear una suscripción, Realm busca datos que coincidan con una consulta sobre un tipo de objeto específico. Puede tener varios conjuntos de suscripciones para distintos tipos de objeto. También puede tener varias consultas sobre el mismo tipo de objeto.
Ejemplo
Puedes crear una suscripción con un nombre específico. Luego, puedes buscarla por nombre para actualizarla o eliminarla.
QuerySubscription<Task>(name: "long-running-completed") { $0.completed == true && $0.progressMinutes > 120 }
Si no especifica name para una suscripción, puede buscar la suscripción mediante la cadena de consulta.
QuerySubscription<Team> { $0.teamName == "Developer Education" }
Nota
Suscripciones duplicadas
Los nombres de las suscripciones deben ser únicos. Intentar añadir una suscripción con el mismo nombre que una ya existente genera un error.
Si no nombra explícitamente una suscripción y, en cambio, se suscribe a la misma consulta sin nombre más de una vez, Realm no conserva las consultas duplicadas en el conjunto de suscripciones.
Si se suscribe a la misma consulta más de una vez con nombres diferentes, Realm conserva ambas suscripciones en el conjunto de suscripciones.
Añadir una suscripción
Agrega una suscripción en un bloque de actualización de suscripciones. Se añade cada nueva suscripción a las suscripciones del cliente en Realm.
Tip
Si su aplicación accede a Realm en un contexto async/await, marque el código con @MainActor para evitar fallas relacionadas con subprocesos.
let realm = try await getRealmWithSingleSubscription() // Opening a realm and accessing it must be done from the same thread. // Marking this function as `@MainActor` avoids threading-related issues. func getRealmWithSingleSubscription() async throws -> Realm { let realm = try await Realm(configuration: flexSyncConfig) let subscriptions = realm.subscriptions try await subscriptions.update { subscriptions.append( QuerySubscription<Team> { $0.teamName == "Developer Education" }) } return realm }
Puede agregar varias suscripciones dentro de un bloque de actualización de suscripciones, incluidas suscripciones de diferentes tipos de objetos.
let realm = try await getRealmWithMultipleSubscriptions() // Opening a realm and accessing it must be done from the same thread. // Marking this function as `@MainActor` avoids threading-related issues. func getRealmWithMultipleSubscriptions() async throws -> Realm { let realm = try await Realm(configuration: flexSyncConfig) let subscriptions = realm.subscriptions try await subscriptions.update { subscriptions.append( QuerySubscription<Task>(name: "completed-tasks") { $0.completed == true }) subscriptions.append( QuerySubscription<Team> { $0.teamName == "Developer Education" }) } return realm }
Arranque el reino con suscripciones iniciales
Nuevo en la versión 10.28.0.
Debe tener al menos una suscripción para poder leer o escribir en el dominio. Puede iniciar un dominio con una suscripción inicial al abrirlo con flexibleSyncConfiguration(). Pase el initialSubscriptions parámetro con las consultas de suscripción que desee usar para iniciar el dominio:
var flexSyncConfig = user.flexibleSyncConfiguration(initialSubscriptions: { subs in subs.append( QuerySubscription<Team> { $0.teamName == "Developer Education" }) })
Si tu aplicación necesita volver a ejecutar esta suscripción inicial cada que la aplicación se inicia, puedes pasar un parámetro adicional - rerunOnOpen. Este es un booleano que indica si la suscripción inicial debe ejecutarse nuevamente cada vez que se inicie la aplicación. Es posible que debas hacer esto para volver a ejecutar rangos de tiempo dinámicos u otras queries que requieran un recálculo de variables estáticas para la suscripción.
En este ejemplo, no queremos que los usuarios se vean abrumados por tareas irrelevantes, por lo que solo cargaremos las tareas con vencimiento en los últimos 7 días y los próximos 7 días. Las tareas con vencimiento hace más de una semana ya no son relevantes, ni tampoco las que vencen en fechas posteriores a la semana siguiente. Con rerunOnOpen, la consulta recalcula dinámicamente los objetos relevantes para sincronizar según el rango de fechas deseado cada vez que se inicia la aplicación.
// Set the date a week ago and the date a week from now, as those are the dates we'll use // in the Flexible Sync query. `rerunOnOpen` lets the app recalculate this query every // time the app opens. let secondsInAWeek: TimeInterval = 604800 let dateLastWeek = (Date.now - secondsInAWeek) let dateNextWeek = (Date.now + secondsInAWeek) var flexSyncConfig = user.flexibleSyncConfiguration(initialSubscriptions: { subs in subs.append( QuerySubscription<Task> { $0.dueDate > dateLastWeek && $0.dueDate < dateNextWeek }) }, rerunOnOpen: true)
Suscribirse a todos los objetos de un tipo específico
Además de sincronizar todos los objetos que coinciden con una query determinada, puedes suscribirte a todos los objetos de un tipo específico. Puedes hacerlo agregando una suscripción sin proporcionar una query.
Por ejemplo, si no quieres ver un equipo específico, pero en cambio quieres suscribirte a todos los objetos de Team, podrías hacer esto:
let realm = try await subscribeToObjectsOfAType() // Opening a realm and accessing it must be done from the same thread. // Marking this function as `@MainActor` avoids threading-related issues. func subscribeToObjectsOfAType() async throws -> Realm { let realm = try await Realm(configuration: flexSyncConfig) let subscriptions = realm.subscriptions try await subscriptions.update { subscriptions.append(QuerySubscription<Team>(name: "all_teams")) } XCTAssertEqual(subscriptions.count, 1) // :remove return realm }
Verifique las suscripciones existentes antes de agregar una nueva
Si el flujo de su aplicación añade la misma suscripción al conjunto de suscripciones cada vez que ejecuta la aplicación, esto no está permitido. En ese caso, compruebe si existe una suscripción antes de añadirla:
let realm = try await checkAndAddSubscription() // Opening a realm and accessing it must be done from the same thread. // Marking this function as `@MainActor` avoids threading-related issues. func checkAndAddSubscription() async throws -> Realm { let realm = try await Realm(configuration: flexSyncConfig) let subscriptions = realm.subscriptions let foundSubscription = subscriptions.first(named: "user_team") try await subscriptions.update { if foundSubscription != nil { foundSubscription!.updateQuery(toType: Team.self, where: { $0.teamName == "Developer Education" }) } else { subscriptions.append( QuerySubscription<Team>(name: "user_team") { $0.teamName == "Developer Education" }) } } return realm }
Espere a que los cambios de suscripción se sincronicen
Actualizar el conjunto de suscripciones localmente es solo un componente del cambio de suscripción. Después del cambio de suscripción local, el realm se sincroniza con el servidor para resolver cualquier actualización de datos debido al cambio de suscripción. Esto podría significar agregar o remover datos del realm sincronizado.
Pre Async/Await
Si su aplicación no utiliza la función async/await de Swift, puede reaccionar a los cambios de suscripción sincronizando con el servidor mediante el bloque onComplete. Este bloque se llama después de que las suscripciones se sincronicen con el servidor. Si desea reaccionar a los cambios de estado de la suscripción, por ejemplo, redibujando una interfaz de usuario o realizando otra acción según los cambios en el conjunto de datos, realice dichas acciones en onComplete. Aquí también puede gestionar los errores opcionales que se producen durante la sincronización.
let subscriptions = realm.subscriptions subscriptions.update({ subscriptions.append( QuerySubscription<Task> { $0.assignee == "John Doe" }) }, onComplete: { error in // error is optional if error == nil { // Flexible Sync has updated data to match the subscription } else { // Handle the error } })
Asíncrono/Espera
Si su aplicación usa async/await, no necesita el bloque onComplete. La actualización se ejecuta de forma asíncrona y genera un error si no se completa correctamente.
func changeSubscription() async throws { let subscriptions = realm.subscriptions try await subcriptions.update { subscriptions.remove { QuerySubscription<Task> { $0.assignee == "Joe Doe" } } } }
Tip
Si su aplicación accede a Realm en un contexto async/await, marque el código con @MainActor para evitar fallas relacionadas con subprocesos.
Estado del conjunto de suscripción
Utilice la propiedad SubscriptionSet.state para leer el estado actual del conjunto de suscripciones.
El superseded estado es un SyncSubscriptionState que puede ocurrir cuando otro subproceso actualiza una suscripción en una instancia diferente del conjunto de suscripciones. Si el estado cambia superseded a, debe obtener una nueva instancia del conjunto de suscripciones para poder actualizarlo.
Nota
Estado de suscripción "Completado"
El estado "Completado" del conjunto de suscripción no significa que la sincronización esté completa ni que todos los documentos se hayan sincronizado. "Completado" significa que han ocurrido las dos cosas siguientes:
La suscripción se ha convertido en el conjunto de suscripciones activas que actualmente se está sincronizando con el servidor.
Los documentos que coincidían con la suscripción en el momento de enviarla al servidor se encuentran ahora en el dispositivo local. Tenga en cuenta que esto no incluye necesariamente todos los documentos que coinciden actualmente con la suscripción.
El SDK de Realm no proporciona una manera de verificar si todos los documentos que coinciden con una suscripción se han sincronizado con el dispositivo.
Actualizar suscripciones con una nueva consulta
Se puede actualizar la query de una suscripción utilizando updateQuery. En este ejemplo, buscamos una subscripción que coincida con nuestra query y luego la actualizamos con una nueva query.
let realm = try await getRealmWithUpdatedSubscriptions() // Opening a realm and accessing it must be done from the same thread. // Marking this function as `@MainActor` avoids threading-related issues. func getRealmWithUpdatedSubscriptions() async throws -> Realm { let realm = try await Realm(configuration: flexSyncConfig) let subscriptions = realm.subscriptions try await subscriptions.update { if let foundSubscription = subscriptions.first(ofType: Team.self, where: { $0.teamName == "Developer Education" }) { foundSubscription.updateQuery(toType: Team.self, where: { $0.teamName == "Documentation" }) } } return realm }
También puedes buscar una suscripción por nombre. En este ejemplo, buscamos una consulta de suscripción por nombre y la actualizamos con una nueva consulta.
let realm = try await getRealmWithUpdatedSubscriptionName() // Opening a realm and accessing it must be done from the same thread. // Marking this function as `@MainActor` avoids threading-related issues. func getRealmWithUpdatedSubscriptionName() async throws -> Realm { let realm = try await Realm(configuration: flexSyncConfig) let subscriptions = realm.subscriptions let foundSubscription = subscriptions.first(named: "user-team") try await subscriptions.update { foundSubscription?.updateQuery(toType: Team.self, where: { $0.teamName == "Documentation" }) } return realm }
Eliminar suscripciones
Para eliminar suscripciones, puedes:
Eliminar una sola consulta de suscripción
Eliminar todas las suscripciones a un tipo de objeto específico
Remover todas las suscripciones sin nombre
Eliminar todas las suscripciones
Cuando elimina una consulta de suscripción, Realm elimina de forma asincrónica los datos sincronizados que coinciden con la consulta del dispositivo cliente.
Eliminar una sola suscripción
Puede eliminar una consulta de suscripción específica en un bloque de actualización de suscripción mediante remove. Especifique la consulta por nombre o úsela como cadena para encontrar la consulta de suscripción que desea eliminar.
let realm = try await getRealmAfterRemovingSubscription() // Opening a realm and accessing it must be done from the same thread. // Marking this function as `@MainActor` avoids threading-related issues. func getRealmAfterRemovingSubscription() async throws -> Realm { let realm = try await Realm(configuration: flexSyncConfig) let subscriptions = realm.subscriptions // Look for a specific subscription, and then remove it let foundSubscription = subscriptions.first(named: "docs-team") try await subscriptions.update { subscriptions.remove(foundSubscription!) } // Or remove a subscription that you know exists without querying for it try await subscriptions.update { subscriptions.remove(named: "existing-subscription") } return realm }
Eliminar todas las suscripciones a un tipo de objeto Realm
Si desea eliminar todas las suscripciones a un tipo de objeto específico, utilice el método removeAll con ofType en un bloque de actualización de suscripción.
let realm = try await getRealmAfterRemovingAllSubscriptionsToAnObjectType() // Opening a realm and accessing it must be done from the same thread. // Marking this function as `@MainActor` avoids threading-related issues. func getRealmAfterRemovingAllSubscriptionsToAnObjectType() async throws -> Realm { let realm = try await Realm(configuration: flexSyncConfig) let subscriptions = realm.subscriptions try await subscriptions.update { subscriptions.removeAll(ofType: Team.self) } return realm }
Eliminar todas las suscripciones sin nombre
Novedad en la versión 10.43.0.
Es posible que desee eliminar las suscripciones sin nombre que son transitorias o generadas dinámicamente, pero dejar las suscripciones con nombre en su lugar.
Puede eliminar todas las suscripciones sin nombre del conjunto de suscripciones configurando unnamedOnly en true cuando llame al método removeAll:
let realm = try await Realm(configuration: flexSyncConfig) // Add 2 subscriptions, one named and one unnamed. let results = try await realm.objects(Team.self).where { $0.teamName == "Developer Education" }.subscribe(name: "team_developer_education") let results2 = try await realm.objects(Task.self).where { $0.completed == false }.subscribe() // Later, remove only the unnamed one let subscriptions = realm.subscriptions try await subscriptions.update { subscriptions.removeAll(unnamedOnly: true) }
Eliminar todas las suscripciones
Para eliminar todas las suscripciones del conjunto de suscripciones, utilice el método removeAll en un bloque de actualización de suscripciones.
Importante
Si elimina todas las suscripciones y no agrega una nueva, obtendrá un error. Un realm abierto con una configuración de sincronización flexible necesita al menos una suscripción para sincronizar con el servidor.
let realm = try await getRealmAfterRemovingAllSubscriptions() // Opening a realm and accessing it must be done from the same thread. // Marking this function as `@MainActor` avoids threading-related issues. func getRealmAfterRemovingAllSubscriptions() async throws -> Realm { let realm = try await Realm(configuration: flexSyncConfig) let subscriptions = realm.subscriptions try await subscriptions.update { subscriptions.removeAll() } return realm }
Consideraciones sobre el rendimiento
Eficiencia de la API
Añadir varias suscripciones con las .subscribe() .unsubscribe() API y descritas en la sección "Suscribirse a consultas" es menos eficiente que realizar actualizaciones por lotes al gestionar las suscripciones manualmente..subscribe() Cada, el SDK de Swift abre un nuevo bloque de actualización. Para un mejor rendimiento al añadir varias suscripciones, utilice la subscriptions.update API descrita en la sección "Gestionar suscripciones manualmente".
Actualizaciones de grupo para un mejor rendimiento
Cada transacción de escritura para un conjunto de suscripciones tiene un coste de rendimiento. Si necesita realizar varias actualizaciones a un objeto de Realm durante una sesión, considere mantener los objetos editados en memoria hasta que se completen todos los cambios. Esto mejora el rendimiento de la sincronización al escribir solo el objeto completo y actualizado en su reino, en lugar de cada cambio.
Requisitos y limitaciones de RQL de sincronización flexible
Requisitos de suscripción a campos consultables indexados
Añadir un campo consultable indexado a tu aplicación puede mejorar el rendimiento de consultas simples sobre datos con particiones estrictas. Por ejemplo, una aplicación donde las consultas asignan datos de forma estricta a un dispositivo, tienda o usuario,user_id == $0, “641374b03725038381d2e1fb” como, es una buena candidata para un campo consultable indexado. Sin embargo, un campo consultable indexado tiene requisitos específicos para su uso en una suscripción de consultas:
El campo consultable indexado debe usarse en todas las consultas de suscripción. No puede faltar en la consulta.
El campo consultable indexado debe usar una comparación
==oINcon una constante al menos una vez en la consulta de suscripción. Por ejemplo,user_id == $0, "641374b03725038381d2e1fb"ostore_id IN $0, {1,2,3}.
Opcionalmente, puede incluir una comparación AND siempre que el campo consultable indexado se compare directamente con una constante usando == o IN al menos una vez. Por ejemplo, store_id IN {1,2,3} AND region=="Northeast" o store_id == 1 AND (active_promotions < 5 OR num_employees < 10).
Las consultas de sincronización flexibleno válidas en un campo consultable indexado incluyen consultas donde:
El campo consultable indexado no usa
ANDcon el resto de la consulta. Por ejemplo,store_id IN {1,2,3} OR region=="Northeast"no es válido porque usaORen lugar deAND. De igual manera,store_id == 1 AND active_promotions < 5 OR num_employees < 10no es válido porqueANDsolo se aplica al término contiguo, no a toda la consulta.El campo consultable indexado no se utiliza en un operador de igualdad. Por ejemplo,
store_id > 2 AND region=="Northeast"no es válido porque solo utiliza el operador>con el campo consultable indexado y no tiene una comparación de igualdad.A la consulta le falta por completo el campo consultable indexado. Por ejemplo,
region=="Northeastotruepredicateno son válidos porque no contienen dicho campo.
Operadores de consulta no admitidos en Flexible Sync
La sincronización flexible presenta algunas limitaciones al usar operadores RQL. Al escribir la suscripción de consulta que determina qué datos sincronizar, el servidor no admite estos operadores. Sin embargo, aún puede usar todas las funciones de RQL para consultar el conjunto de datos sincronizados en la aplicación cliente.
Tipo de operador | Operadores no compatibles |
|---|---|
Operadores agregados |
|
Sufijos de consulta |
|
Las consultas que no distinguen entre mayúsculas y minúsculas ([c]) no pueden usar índices eficazmente. Por lo tanto, no se recomiendan, ya que podrían causar problemas de rendimiento.
Flexible Sync solo admite @count para campos de matriz.
Consultas de lista
Flexible Sync admite la consulta de listas mediante el operador IN.
Puede consultar una lista de constantes para ver si contiene el valor de un campo consultable:
// Query a constant list for a queryable field value "priority IN { 1, 2, 3 }"
Si un campo consultable tiene un valor de matriz, puedes consultar para ver si contiene un valor constante:
// Query an array-valued queryable field for a constant value "'comedy' IN genres"
Advertencia
No se pueden comparar dos listas en una consulta de sincronización flexible. Tenga en cuenta que esta sintaxis del lenguaje de consulta de dominio es válida fuera de las consultas de sincronización flexible.
// Invalid Flexible Sync query. Do not do this! "{'comedy', 'horror', 'suspense'} IN genres" // Another invalid Flexible Sync query. Do not do this! "ANY {'comedy', 'horror', 'suspense'} != ANY genres"
Objetos incrustados o vinculados
La sincronización flexible no admite consultas sobre propiedades en objetos incrustados ni enlaces. Por ejemplo, obj1.field == "foo".
Límite de tamaño de consulta
El límite de tamaño para cualquier suscripción de consulta en su conjunto de suscripciones es de kB. Superar este límite genera 256 un error "LimitsExceeded".