Consumo de una base de datos de documentos de Azure Cosmos DB en Xamarin.Forms
Una base de datos de documentos de Azure Cosmos DB es una base de datos NoSQL que proporciona acceso de baja latencia a documentos JSON, lo que ofrece un servicio de base de datos rápido, altamente disponible y escalable para aplicaciones que requieren una escalabilidad sin problemas y una replicación global. En este artículo se explica cómo usar la biblioteca cliente de .NET Standard de Azure Cosmos DB para integrar una base de datos de documentos de Azure Cosmos DB en una aplicación de Xamarin.Forms.
Vídeo sobre Microsoft Azure Cosmos DB
Una cuenta de base de datos de documentos de Azure Cosmos DB se puede aprovisionar mediante una suscripción de Azure. Cada cuenta de base de datos puede tener cero o más bases de datos. Una base de datos de documentos en Azure Cosmos DB es un contenedor lógico para colecciones y usuarios de documentos.
Una base de datos de documentos de Azure Cosmos DB puede contener cero o más colecciones de documentos. Cada colección de documentos puede tener un nivel de rendimiento diferente, lo que permite especificar más rendimiento para las colecciones a las que se accede con frecuencia y menos rendimiento para las colecciones a las que se accede con poca frecuencia.
Cada colección de documentos consta de cero o más documentos JSON. Los documentos de una colección están libres de esquemas, por lo que no es necesario que compartan la misma estructura o campos. A medida que se agregan documentos a una colección de documentos, Azure Cosmos DB los indexa automáticamente y están disponibles para ser consultados.
Con fines de desarrollo, una base de datos de documentos también se puede consumir a través de un emulador. Con el emulador, las aplicaciones se pueden desarrollar y probar localmente, sin crear una suscripción de Azure ni incurrir en costos. Para obtener más información sobre el emulador, consulte Desarrollo local con el emulador de Azure Cosmos DB.
En este artículo, y la aplicación de ejemplo que acompaña, se muestra una aplicación de lista de tareas donde las tareas se almacenan en una base de datos de documentos de Azure Cosmos DB. Para obtener más información sobre la aplicación de ejemplo, consulte Descripción del ejemplo.
Para obtener más información sobre Azure Cosmos DB, consulte la Documentación sobre Azure Cosmos DB.
Nota:
Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
Configuración
El proceso para integrar una base de datos de documentos de Azure Cosmos DB en una aplicación Xamarin.Forms es el siguiente:
- Cree una cuenta de Azure Cosmos DB. Para obtener más información, consulte Creación de una cuenta de Azure Cosmos DB.
- Agregue el paquete NuGet de la biblioteca cliente de .NET Standard de Azure Cosmos DB a los proyectos de plataforma de la solución Xamarin.Forms.
- Agregue directivas
using
para los espacios de nombresMicrosoft.Azure.Documents
,Microsoft.Azure.Documents.Client
yMicrosoft.Azure.Documents.Linq
a las clases que tendrán acceso a la cuenta de Azure Cosmos DB.
Después de realizar estos pasos, se puede usar la biblioteca cliente de .NET Standard de Azure Cosmos DB para configurar y ejecutar solicitudes en la base de datos de documentos.
Nota:
La biblioteca cliente de .NET Standard de Azure Cosmos DB solo se puede instalar en proyectos de plataforma y no en un proyecto de biblioteca de clases portable (PCL). Por lo tanto, la aplicación de ejemplo es un proyecto de acceso compartido (SAP) para evitar la duplicación de código. Sin embargo, la clase DependencyService
se puede usar en un proyecto PCL para invocar el código de la biblioteca cliente de .NET Standard de Azure Cosmos DB contenido en proyectos específicos de la plataforma.
Consumo de la cuenta de Azure Cosmos DB
El tipo DocumentClient
encapsula el punto de conexión, las credenciales y la directiva de conexión que se usan para acceder a la cuenta de Azure Cosmos DB y se usa para configurar y ejecutar solicitudes en la cuenta. En el siguiente ejemplo de código se muestra cómo crear una instancia de esta clase:
DocumentClient client = new DocumentClient(new Uri(Constants.EndpointUri), Constants.PrimaryKey);
El URI de Azure Cosmos DB y la clave principal deben proporcionarse al constructor DocumentClient
. Se pueden obtener desde Azure Portal. Para obtener más información, consulte Conexión de una cuenta de Azure Cosmos DB.
Crear una base de datos
Una base de datos de documentos es un contenedor lógico para colecciones de documentos y usuarios, y se puede crear en Azure Portal o mediante programación mediante el método DocumentClient.CreateDatabaseIfNotExistsAsync
:
public async Task CreateDatabase(string databaseName)
{
...
await client.CreateDatabaseIfNotExistsAsync(new Database
{
Id = databaseName
});
...
}
El método CreateDatabaseIfNotExistsAsync
especifica un objeto Database
como argumento, con el objeto Database
que especifica el nombre de la base de datos como su propiedad Id
. El método CreateDatabaseIfNotExistsAsync
crea la base de datos si no existe o devuelve la base de datos si ya existe. Sin embargo, la aplicación de ejemplo omite los datos devueltos por el método CreateDatabaseIfNotExistsAsync
.
Nota:
El método CreateDatabaseIfNotExistsAsync
devuelve un objeto Task<ResourceResponse<Database>>
y se puede comprobar el código de estado de la respuesta para determinar si se creó una base de datos o si se devolvió una base de datos existente.
Creación de una colección de documentos
Una colección de documentos es un contenedor para documentos JSON y se puede crear en Azure Portal o mediante programación mediante el método DocumentClient.CreateDocumentCollectionIfNotExistsAsync
:
public async Task CreateDocumentCollection(string databaseName, string collectionName)
{
...
// Create collection with 400 RU/s
await client.CreateDocumentCollectionIfNotExistsAsync(
UriFactory.CreateDatabaseUri(databaseName),
new DocumentCollection
{
Id = collectionName
},
new RequestOptions
{
OfferThroughput = 400
});
...
}
El método CreateDocumentCollectionIfNotExistsAsync
requiere dos argumentos obligatorios: un nombre de base de datos especificado como Uri
y un objeto DocumentCollection
. El objeto DocumentCollection
representa una colección de documentos cuyo nombre se especifica con la propiedad Id
. El método CreateDocumentCollectionIfNotExistsAsync
crea la colección de documentos si no existe o devuelve la colección de documentos si ya existe. Sin embargo, la aplicación de ejemplo omite los datos devueltos por el método CreateDocumentCollectionIfNotExistsAsync
.
Nota:
El método CreateDocumentCollectionIfNotExistsAsync
devuelve un objeto Task<ResourceResponse<DocumentCollection>>
y se puede comprobar el código de estado de la respuesta para determinar si se creó una colección de documentos o si se devolvió una colección de documentos existente.
De manera opcional, el método CreateDocumentCollectionIfNotExistsAsync
también puede especificar un objeto RequestOptions
, que encapsula las opciones que se pueden especificar para las solicitudes emitidas a la cuenta de Azure Cosmos DB. La propiedad RequestOptions.OfferThroughput
se usa para definir el nivel de rendimiento de la colección de documentos y, en la aplicación de ejemplo, se establece en 400 unidades de solicitud por segundo. Este valor debe aumentarse o disminuirse en función de si se accederá con mayor o menor frecuencia a la colección.
Importante
Tenga en cuenta que el método CreateDocumentCollectionIfNotExistsAsync
creará una nueva colección con un rendimiento reservado, lo que tiene implicaciones de precios.
Recuperación de documentos de una colección de documentos
El contenido de una colección de documentos se puede recuperar mediante la creación y ejecución de una consulta de documento. Se crea una consulta de documento con el método DocumentClient.CreateDocumentQuery
:
public async Task<List<TodoItem>> GetTodoItemsAsync()
{
...
var query = client.CreateDocumentQuery<TodoItem>(collectionLink)
.AsDocumentQuery();
while (query.HasMoreResults)
{
Items.AddRange(await query.ExecuteNextAsync<TodoItem>());
}
...
}
Esta consulta recupera de manera asincrónica todos los documentos de la colección especificada y coloca los documentos en una colección List<TodoItem>
para su visualización.
El método CreateDocumentQuery<T>
especifica un argumento Uri
que representa la colección que se debe consultar para los documentos. En este ejemplo, la variable collectionLink
es un campo de nivel de clase que especifica el Uri
que representa la colección de documentos de la que se van a recuperar documentos de:
Uri collectionLink = UriFactory.CreateDocumentCollectionUri(Constants.DatabaseName, Constants.CollectionName);
El método CreateDocumentQuery<T>
crea una consulta que se ejecuta de manera sincrónica y devuelve un objeto IQueryable<T>
. Sin embargo, el método AsDocumentQuery
convierte el objeto IQueryable<T>
en un objeto IDocumentQuery<T>
que se puede ejecutar de manera asincrónica. La consulta asincrónica se ejecuta con el método IDocumentQuery<T>.ExecuteNextAsync
, que recupera la siguiente página de resultados de la base de datos de documentos, con la propiedad IDocumentQuery<T>.HasMoreResults
que indica si hay resultados adicionales que se van a devolver desde la consulta.
Los documentos se pueden filtrar en el lado del servidor mediante la inclusión de una cláusula Where
en la consulta, que aplica un predicado de filtrado a la consulta en la colección de documentos:
var query = client.CreateDocumentQuery<TodoItem>(collectionLink)
.Where(f => f.Done != true)
.AsDocumentQuery();
Esta consulta recupera todos los documentos de la colección cuya propiedad Done
es igual a false
.
Inserción de un documento en una colección de documentos
Los documentos son contenido JSON definido por el usuario y se pueden insertar en una colección de documentos con el método DocumentClient.CreateDocumentAsync
:
public async Task SaveTodoItemAsync(TodoItem item, bool isNewItem = false)
{
...
await client.CreateDocumentAsync(collectionLink, item);
...
}
El método CreateDocumentAsync
especifica un argumento Uri
que representa la colección en la que se debe insertar el documento y un argumento object
que representa el documento que se va a insertar.
Reemplazo de un documento en una colección de documentos
Los documentos se pueden reemplazar en una colección de documentos mediante el método DocumentClient.ReplaceDocumentAsync
:
public async Task SaveTodoItemAsync(TodoItem item, bool isNewItem = false)
{
...
await client.ReplaceDocumentAsync(UriFactory.CreateDocumentUri(Constants.DatabaseName, Constants.CollectionName, item.Id), item);
...
}
El método ReplaceDocumentAsync
especifica un argumento Uri
que representa el documento de la colección que se debe reemplazar y un argumento object
que representa los datos actualizados del documento.
Eliminación de un documento de una colección de documentos
Un documento se puede eliminar de una colección de documentos mediante el método DocumentClient.DeleteDocumentAsync
:
public async Task DeleteTodoItemAsync(string id)
{
...
await client.DeleteDocumentAsync(UriFactory.CreateDocumentUri(Constants.DatabaseName, Constants.CollectionName, id));
...
}
El método DeleteDocumentAsync
especifica un argumento Uri
que representa el documento de la colección que se debe eliminar.
Eliminación de una colección de documentos
Una colección de documentos se puede eliminar de una base de datos mediante el método DocumentClient.DeleteDocumentCollectionAsync
:
await client.DeleteDocumentCollectionAsync(collectionLink);
El método DeleteDocumentCollectionAsync
especifica un argumento Uri
que representa la colección de documentos que se va a eliminar. Tenga en cuenta que invocar este método también eliminará los documentos almacenados en la colección.
Eliminación de una base de datos
Se puede eliminar una base de datos de una cuenta de base de datos de Azure Cosmos DB mediante el método DocumentClient.DeleteDatabaesAsync
:
await client.DeleteDatabaseAsync(UriFactory.CreateDatabaseUri(Constants.DatabaseName));
El método DeleteDatabaseAsync
especifica un argumento Uri
que representa la base de datos que se va a eliminar. Tenga en cuenta que invocar este método también eliminará las colecciones de documentos almacenadas en la base de datos y los documentos almacenados en las colecciones de documentos.
Resumen
En este artículo se explica cómo usar la biblioteca cliente de .NET Standard de Azure Cosmos DB para integrar una base de datos de documentos de Azure Cosmos DB en una aplicación Xamarin.Forms. Una base de datos de documentos de Azure Cosmos DB es una base de datos NoSQL que proporciona acceso de baja latencia a documentos JSON, lo que ofrece un servicio de base de datos rápido, altamente disponible y escalable para aplicaciones que requieren una escalabilidad sin problemas y una replicación global.