

O SDK AWS móvel para Xamarin agora está incluído no. AWS SDK para .NET Este guia faz referência à versão arquivada do Mobile SDK para Xamarin.

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Amazon DynamoDB
<a name="dynamodb"></a>

## O que é o Amazon DynamoDB?
<a name="what-is-amazon-dynamodb"></a>

 O [Amazon DynamoDB](https://aws.amazon.com/dynamodb/) é um serviço de banco de dados não relacional rápido e altamente dimensionável. O DynamoDB remove limitações de escalabilidade tradicionais sobre armazenamento de dados, mantendo, ao mesmo tempo, a baixa latência e o desempenho previsível.

## Principais conceitos
<a name="key-concepts"></a>

Os conceitos do modelo de dados do DynamoDB incluem tabelas, itens e atributos.

### Tabelas
<a name="tables"></a>

No Amazon DynamoDB, um banco de dados é uma coleção de tabelas. Uma tabela é uma coleção de itens, e cada item é uma coleção de atributos.

Em um banco de dados relacional, uma tabela tem um schema predefinido, como nome da tabela, chave primária, lista de seus nomes de coluna e seus tipos de dados. Todos os registros armazenados na tabela devem ter o mesmo conjunto de colunas. Por outro lado, o DynamoDB só requer que uma tabela tenha uma chave primária, mas não requer que você defina todos os nomes de atributo e tipos de dados com antecedência.

Para saber mais sobre como trabalhar com tabelas, consulte [Trabalhar com tabelas no DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html).

### Itens e atributos
<a name="items-and-attributes"></a>

Os itens individuais em uma tabela do DynamoDB pode ter qualquer número de atributos, embora haja um limite de 400 KB para o tamanho do item. Um tamanho de item é a soma dos tamanhos de seus nomes e valores de atributo (tamanhos binários e UTF-8).

Cada atributo em um item é um par de nome-valor. Um atributo pode ser um conjunto de valor único ou multivalor. Por exemplo, um item de livro pode ter os atributos title e authors. Cada livro tem um título, mas pode ter vários autores. O atributo multivalor é um conjunto; não são permitidos valores duplicados.

Por exemplo, é recomendável armazenar um catálogo de produtos no DynamoDB. Você pode criar uma tabela, ProductCatalog, com o atributo Id como chave primária. A chave primária identifica exclusivamente cada item, para que não haja dois produtos na tabela com o mesmo ID.

Para saber mais sobre como trabalhar com itens, consulte [Trabalhar com itens no DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html).

### Tipos de dados
<a name="data-types"></a>

O Amazon DynamoDB é compatível com os seguintes tipos de dados:
+  **Tipos escalares** – Número, string, binário, booleano e nulo.
+  **Tipos de vários valores** – Conjunto de strings, conjunto de números e conjunto binário.
+  **Tipos de documento** – Lista e mapa.

Para obter mais informações sobre tipos de dados escalares, tipos de dados de vários valores e tipos de dados de documento, consulte [Tipos de dados do DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModel.DataTypes).

### Chave primária
<a name="primary-key"></a>

Ao criar uma tabela, além do nome dela, você deve especificar a chave primária da tabela. A chave primária identifica exclusivamente cada item na tabela, de modo que não possa haver dois itens com a mesma chave. O DynamoDB é compatível com os seguintes tipos de chaves primárias:
+  **Chave hash**: a chave primária é composta por um atributo, um atributo de hash. O DynamoDB cria um índice de hash não ordenado neste atributo de chave primária. Cada item da tabela é identificado exclusivamente por seu valor de chave de hash.
+  **Chave hash e chave de intervalo**: a chave primária é composta por dois atributos. O primeiro atributo é o atributo de hash; o segundo atributo é o atributo de intervalo. O DynamoDB cria um índice de hash não ordenado no atributo de chave primária de hash e um índice de intervalo classificado no atributo de chave primária de intervalo. Cada item da tabela é identificado exclusivamente pela combinação de seus valores de chave de hash e de intervalo. Dois itens podem ter o mesmo valor de chave de hash, mas eles devem ter valores de chave de intervalo diferentes.

### Índices secundários
<a name="secondary-indexes"></a>

Quando você criar uma tabela com uma chave de hash e uma chave de intervalo, poderá definir um ou mais índices secundários nessa tabela, se desejar. Um índice secundário permite consultar os dados na tabela usando uma chave alternativa, além de consultas com base na chave primária.

O DynamoDB oferece suporte a dois tipos de índices secundários: índices secundários locais e índices secundários globais.
+  **Índice secundário local**: um índice que possui a mesma chave hash que a tabela, mas uma chave de intervalo diferente.
+  **Índice secundário global**: um índice com uma chave hash e uma chave de intervalo que podem ser diferentes das contidas na tabela.

Você pode definir até cinco índices secundários globais e cinco índices secundários locais por tabela. Para obter mais informações, consulte [Como melhorar o acesso a dados com índices secundários no DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html) no Guia do desenvolvedor do DynamoDB.

### Consulta e verificação
<a name="query-and-scan"></a>

Além de usar chaves primárias para acessar itens, o Amazon DynamoDB também fornece APIs duas para pesquisar os dados: consulta e digitalização. É recomendável que você leia [Orientações para consulta e verificação](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScanGuidelines.html) no Guia do desenvolvedor do DynamoDB Developer Guide para se familiarizar com algumas práticas recomendadas.

#### Consulta
<a name="query"></a>

A operação Query localiza os itens em uma tabela ou um índice secundário usando somente valores de atributo de chave primária. Você deve fornecer um nome de atributo de chave de hash e um valor distinto a serem procurados. Se desejar, você pode fornecer um nome de atributo de chave de intervalo e um valor, e usar um operador de comparação para refinar os resultados da pesquisa.

Para consultas de exemplo, consulte:
+  [Uso do modelo de documento](dynamodb-integration-docmodel.md) 
+  [Uso do modelo de persistência de objeto](dynamodb-integration-objectpersistencemodel.md) 
+  [Usando o nível de serviço do DynamoDB APIs](dynamodb-integration-lowlevelapi.md) 

Para obter mais informações sobre consultas, consulte [Consulta](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#QueryAndScan.Query) no Guia do desenvolvedor do DynamoDB.

#### Verificar
<a name="scan"></a>

Uma operação Scan lê cada item de uma tabela ou de um índice secundário. Por padrão, uma operação Scan retorna todos os atributos de dados de cada item na tabela ou no índice. Você pode usar o ProjectionExpression parâmetro para que Scan retorne apenas alguns dos atributos, em vez de todos eles.

Para verificações de exemplo, consulte:
+  [Uso do modelo de documento](dynamodb-integration-docmodel.md) 
+  [Uso do modelo de persistência de objeto](dynamodb-integration-objectpersistencemodel.md) 
+  [Usando o nível de serviço do DynamoDB APIs](dynamodb-integration-lowlevelapi.md) 

Para obter mais informações sobre verificações, consulte [Verificação](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#QueryAndScan.Scan) no Guia do desenvolvedor do DynamoDB.

## Configuração do projeto
<a name="project-setup"></a>

### Pré-requisitos
<a name="prerequisites"></a>

Para usar o DynamoDB em seu aplicativo, você precisará adicionar o SDK ao projeto. Para fazer isso, siga as instruções em [Configuração do AWS Mobile SDK para .NET e Xamarin](setup.md).

### Criação de uma tabela do DynamoDB
<a name="create-a-dynamodb-table"></a>

Para criar uma tabela, acesse o [console do DynamoDB](https://console.aws.amazon.com/dynamodb/home) e siga estas etapas:

1. Clique em **Create Table (Criar tabela)**.

1. Informe o nome da tabela.

1. Selecione **Hash** como tipo de chave primária.

1. Selecione um tipo e insira um valor para o nome do atributo de hash. Clique em **Continue**.

1. Na página **Add Indexes (Adicionar índices)**, se você pretende usar os índices secundários globais, defina **Index Type (Tipo de índice)** como "Global Secondary Index" (Índice secundário global) e, em **Index Hash Key (Chave hash do índice)**, insira uma valor para o índice secundário. Isso permitirá que você faça operações de consulta e verificação usando os índices primário e secundário. Clique em **Add Index To Table (Adicionar índice à tabela)** e em **Continue (Continuar)**. Para ignorar o uso de índices secundários globais, clique em **Continue (Continuar)**.

1. Defina a capacidade de leitura e gravação para os níveis desejados. Para obter mais informações sobre como configurar a capacidade, consulte [Throughput provisionado no Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughputIntro.html). Clique em **Continue**.

1. Na próxima tela, insira um e-mail de notificação para criar alarmes de taxa de transferência, se desejado. Clique em **Continue**.

1. Na página de resumo, clique em **Create (Criar)**. O DynamoDB criará seu banco de dados.

### Definição de permissões para DynamoDB
<a name="set-permissions-for-dynamodb"></a>

Para usar o DynamoDB em um aplicativo, defina as permissões corretas. A seguinte política do IAM permite que o usuário exclua, obtenha, insira, consulte, verifique e atualize itens em uma tabela específica do DynamoDB, que é identificada pelo [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html):

```
{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:DeleteItem",
        "dynamodb:GetItem",
        "dynamodb:PutItem",
        "dynamodb:Query",
        "dynamodb:Scan",
        "dynamodb:UpdateItem"
      ],
      "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/MyTable"
    }
  ]
}
```

Você pode modificar as políticas no [console do IAM](https://console.aws.amazon.com/iam/). Você deve adicionar ou remover ações permitidas com base nas necessidades do seu aplicativo.

Para saber mais sobre as políticas do IAM, consulte [Usar o IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM_Introduction.html).

Para saber mais sobre as políticas específicas do DynamoDB, consulte [Usar o IAM para controlar o acesso a recursos do DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/UsingIAMWithDDB.html) no Guia do desenvolvedor do DynamoDB.

## Integração do DynamoDB ao aplicativo
<a name="integrating-dynamodb-with-your-application"></a>

O AWS Mobile SDK para .NET e Xamarin fornece uma biblioteca de alto nível para trabalhar com o DynamoDB. Você também pode fazer solicitações diretamente com base na API de nível inferior do DynamoDB, mas, na maioria dos casos de uso, é recomendável o uso da biblioteca de nível superior. AmazonDynamoDBClient É uma parte especialmente útil da biblioteca de alto nível. Usando essa classe, você pode realizar várias operações de criação, leitura, atualização e exclusão (CRUD) e executar consultas.

O AWS Mobile SDK para .NET e Xamarin permite que você APIs faça chamadas usando o AWS SDK para.NET para trabalhar com o DynamoDB. Todos APIs eles estão disponíveis no AWSSDK domínio.dll. Para obter mais informações sobre como fazer download do AWS SDK para .NET, consulte [AWS SDK para .NET](https://aws.amazon.com/sdk-for-net/).

Há três formas de interagir com o DynamoDB no aplicativo Xamarin:
+  **Modelo de documento**: esta API oferece classes wrapper sobre a API de nível inferior do DynamoDB para simplificar ainda mais as tarefas de programação. Table e Document são as principais classes wrapper. Você pode usar o modelo de documento nas operações de dados, como criar, recuperar, atualizar e excluir itens. A API está disponível no Amazon.DynamoDB. DocumentModel namespace.
+  **Modelo de persistência de objeto**: a API Object Persistence permite mapear classes do lado do cliente para as tabelas do DynamoDB. Em seguida, cada instância de objeto é mapeada para um item nas tabelas correspondentes. A DBContext classe Dynamo nessa API fornece métodos para você salvar objetos do lado do cliente em uma tabela, recuperar itens como objetos e realizar consultas e escaneamentos. Você pode usar o modelo de persistência de objeto nas operações de dados, como criar, recuperar, atualizar e excluir itens. Primeiro, crie as tabelas usando a API Service Client e, em seguida, use o modelo de persistência de objeto para mapear as classes para as tabelas. A API está disponível no Amazon.DynamoDB. DataModel namespace.
+  **API Service Client**: esta é a API de nível de protocolo que é mapeada estreitamente para a API do DynamoDB. Você pode usar essa API de nível inferior em todas as operações de tabela e item, como criar, atualizar e excluir tabela e itens. Você também pode consultar e verificar as tabelas. Esta API está disponível no namespace Amazon.DynamoDB.

Esses três modelos são descritos detalhadamente nos tópicos a seguir:

**Topics**

# Uso do modelo de documento
<a name="dynamodb-integration-docmodel"></a>

O modelo de documentos oferece cursos em todo o nível inferior de API do .NET. Table e Document são as principais classes wrapper. Você pode usar o modelo de documento para criar, recuperar, atualizar e excluir itens. Para criar, atualizar e excluir tabelas, você deve usar a API de nível inferior. Para obter instruções sobre como usar a API de baixo nível, consulte Como [usar o nível de serviço do DynamoDB](dynamodb-integration-lowlevelapi.md). APIs A API de baixo nível está disponível no Amazon.dynamoDB. DocumentModel namespace.

Para saber mais sobre o Modelo de documento, consulte [Modelo de documento do .NET](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DotNetSDKMidLevel.html).

## Criação de um cliente DynamoDB
<a name="create-a-dynamodb-client"></a>

Para criar um cliente DynamoDB:

```
var client = new AmazonDynamoDBClient(credentials,region);
DynamoDBContext context = new DynamoDBContext(client);
```

## Operações de CRUD
<a name="crud-operations"></a>

### Salvar um item
<a name="save-an-item"></a>

Crie um item:

```
Table table = Table.LoadTable(client, "Books");
id = Guid.NewGuid().ToString();
var books = new Document();
books["Id"] = id;
books["Author"] = "Mark Twain";
books["Title"] = "Adventures of Huckleberry Finn";
books["ISBN"] = "112-111111";
books["Price"] = "10";
```

Salve um item em uma tabela do DynamoDB:

```
var book = await table.PutItemAsync(books);
```

### Recuperação de um item
<a name="retrieve-an-item"></a>

Para recuperar um item:

```
public async Task GetItemAsync(AWSCredentials credentials, RegionEndpoint region)
{
      var client = new AmazonDynamoDBClient(credentials, region);
      Table books = Table.LoadTable(client, "Books");
      var book = await books.GetItemAsync(id);
}
```

### Atualização de um item
<a name="update-an-item"></a>

Para atualizar um item:

```
public async Task UpdateItemAttributesAsync(AWSCredentials credentials, RegionEndpoint region)
{
      var book = new Document();
      book["Id"] = id;
      book["PageCount"] = "200";
      var client = new AmazonDynamoDBClient(credentials, region);
      Table books = Table.LoadTable(client, "Books");
      Document updatedBook = await books.UpdateItemAsync(book);
}
```

Para atualizar um item de forma condicional:

```
public async Task UpdateItemConditionallyAsync(AWSCredentials credentials, RegionEndpoint region) {
      var book = new Document();
      book["Id"] = id;
      book["Price"] = "30";

      // For conditional price update, creating a condition expression.
      Expression expr = new Expression();
      expr.ExpressionStatement = "Price = :val";
      expr.ExpressionAttributeValues[":val"] = 10.00;

      var client = new AmazonDynamoDBClient(credentials, region);
      Table books = Table.LoadTable(client, "Books");

      Document updatedBook = await books.UpdateItemAsync(book);
}
```

### Exclusão de um item
<a name="delete-an-item"></a>

Para excluir um item:

```
public async Task DeleteItemAsync(AWSCredentials credentials, RegionEndpoint region)
{
  var client = new AmazonDynamoDBClient(credentials, region);
  Table books = Table.LoadTable(client, "Books");
  await books.DeleteItemAsync(id);
}
```

### Consulta e verificação
<a name="query-and-scan"></a>

Para consultar e recuperar todos os livros cujo autor seja "Mark Twain":

```
public async Task QueryAsync(AWSCredentials credentials, RegionEndpoint region) {
  var client = new AmazonDynamoDBClient(credentials, region);
  Table books = Table.LoadTable(client, "Books");
  var search = books.Query(new QueryOperationConfig() {
   IndexName = "Author-Title-index",
   Filter = new QueryFilter("Author", QueryOperator.Equal, "Mark Twain")
  });
  Console.WriteLine("ScanAsync: printing query response");
  var documents = await search.GetRemainingAsync();
  documents.ForEach((d) = > {
   PrintDocument(d);
  });
}
```

O código de exemplo de verificação abaixo retorna todos os livros de nossa tabela:

```
public async Task ScanAsync(AWSCredentials credentials, RegionEndpoint region) {
      var client = new AmazonDynamoDBClient(credentials, region);
      Table books = Table.LoadTable(client, "Books");
      var search = books.Scan(new ScanOperationConfig() {
              ConsistentRead = true
      });
      Console.WriteLine("ScanAsync: printing scan response");
      var documents = await search.GetRemainingAsync();
      documents.ForEach((d) = > {
              PrintDocument(d);
      });
}
```

# Uso do modelo de persistência de objetos
<a name="dynamodb-integration-objectpersistencemodel"></a>

O AWS Mobile SDK para .NET e Xamarin fornece um modelo de persistência de objetos que permite mapear classes do cliente para uma tabela do DynamoDB. Cada instância do objeto, então, mapeia para um item na tabela correspondente. Para salvar seus objetos do lado do cliente em uma tabela, o modelo de persistência de objetos fornece a DBContext classe Dynamo, um ponto de entrada para o DynamoDB. Esta classe fornece uma conexão ao DynamoDB e permite que você acesse tabelas, execute várias operações CRUD e realize consultas.

O modelo de persistência de objetos não fornece uma API para criar, atualizar ou excluir tabelas. Ele fornece apenas operações de dados. Para criar, atualizar e excluir tabelas, você deve usar a API de nível inferior. Para obter instruções sobre como usar a API de baixo nível, consulte Como [usar o nível de serviço do DynamoDB](dynamodb-integration-lowlevelapi.md). APIs

## Visão geral do
<a name="overview"></a>

O modelo de persistência de objetos fornece um conjunto de atributos para mapear classes do lado do cliente para tabelas e properties/fields atributos de tabela. O modelo de persistência de objetos é compatível com o mapeamento explícito e o padrão entre as propriedades das classes e os atributos da tabela.
+  **Mapeamento explícito: para mapear** uma propriedade para uma chave primária, você deve usar os atributos do modelo Dynamo DBHash Key e Dynamo DBRange Key Object Persistence. Além disso, para os atributos de chave não primária, se o nome de uma propriedade em sua classe e o atributo de tabela correspondente para o qual você deseja mapeá-la não forem iguais, você deverá definir o mapeamento adicionando explicitamente o atributo do DBProperty Dynamo.
+  **Mapeamento padrão** – Por padrão, o modelo de persistência de objetos mapeia as propriedades de classe para os atributos com o mesmo nome na tabela.

Você não precisa mapear todas as propriedades de classe. Você identifica essas propriedades adicionando o DBIgnore atributo do Dynamo. Salvar e recuperar uma instância de um objeto pode omitir qualquer propriedade marcada com este atributo.

## Tipos de dados compatíveis
<a name="supported-data-types"></a>

O modelo de persistência de objeto é compatível com um conjunto de tipos de dados primitivos do .NET, com a coleta dos mesmos e com os tipos de dados arbitrários. O modelo é compatível com os seguintes tipos de dados primitivos.
+ bool
+ byte
+ char
+ DateTime
+ decimal, duplo, float
+ Int16, Int32, Int64
+ SByte
+ string
+ UInt16, UInt32, UInt64

O modelo de persistência de objetos .NET também é compatível com os tipos de coleta que contêm as seguintes limitações:
+ O tipo de coleção deve implementar a ICollection interface.
+ O tipo de Coleta deve ser composto por tipos primitivos compatíveis. Por exemplo, ICollection<string>, ICollection<bool>.
+ O tipo de coleta deve fornecer um construtor sem parâmetro.

Para obter mais informações sobre o modelo de persistência de objetos, consulte o [Modelo de persistência de objetos do .NET](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DotNetSDKHighLevel.html).

## Criação de um cliente DynamoDB
<a name="create-a-dynamodb-client"></a>

Para criar um cliente DynamoDB:

```
var client = new AmazonDynamoDBClient(credentials,region);
DynamoDBContext context = new DynamoDBContext(client);
```

## Operações de CRUD
<a name="crud-operations"></a>

### Salvar um objeto
<a name="save-an-object"></a>

Criar um objeto:

```
[DynamoDBTable("Books")]
public class Book {
  [DynamoDBHashKey] // Hash key.
  public string Id {
    get;
    set;
  }

  [DynamoDBGlobalSecondaryIndexHashKey]
  public string Author {
    get;
    set;
  }

  [DynamoDBGlobalSecondaryIndexRangeKey]
  public string Title {
    get;
    set;
  }
  public string ISBN {
    get;
    set;
  }
  public int Price {
    get;
    set;
  }
  public string PageCount {
    get;
    set;
  }
}

Book myBook = new Book
{
    Id = id,
    Author = "Charles Dickens",
    Title = "Oliver Twist",
    ISBN = "111-1111111001",
    Price = 10,
    PageCount = 300
};
```

Salve um objeto em uma tabela do DynamoDB:

```
context.Save(myBook);
```

### Recuperar um objeto
<a name="retrieve-an-object"></a>

Para recuperar um objeto:

```
Book retrievedBook = context.Load<Book>(1);
```

### Atualizar um objeto
<a name="update-an-object"></a>

Para atualizar um objeto:

```
Book retrievedBook = context.Load<Book>(1);
retrievedBook.ISBN = "111-1111111001";
context.Save(retrievedBook);
```

### Excluir um objeto
<a name="delete-an-object"></a>

Para excluir um objeto:

```
Book retrievedBook = context.Load<Book>(1);
context.Delete(retrievedBook);
```

## Consulta e verificação
<a name="query-and-scan"></a>

Para consultar e recuperar todos os livros cujo autor seja "Charles Dickens":

```
public async Task QueryAsync(AWSCredentials credentials, RegionEndpoint region) {
  var client = new AmazonDynamoDBClient(credentials, region);
  DynamoDBContext context = new DynamoDBContext(client);

  var search = context.FromQueryAsync < Book > (new Amazon.DynamoDBv2.DocumentModel.QueryOperationConfig() {
    IndexName = "Author-Title-index",
    Filter = new Amazon.DynamoDBv2.DocumentModel.QueryFilter("Author", Amazon.DynamoDBv2.DocumentModel.QueryOperator.Equal, "Charles Dickens")
  });

  Console.WriteLine("items retrieved");

  var searchResponse = await search.GetRemainingAsync();
  searchResponse.ForEach((s) = > {
    Console.WriteLine(s.ToString());
  });
}
```

O código de exemplo de verificação abaixo retorna todos os livros de nossa tabela:

```
public async Task ScanAsync(AWSCredentials credentials, RegionEndpoint region) {
  var client = new AmazonDynamoDBClient(credentials, region);
  DynamoDBContext context = new DynamoDBContext(client);

  var search = context.FromScanAsync < Book > (new Amazon.DynamoDBv2.DocumentModel.ScanOperationConfig() {
   ConsistentRead = true
  });

  Console.WriteLine("items retrieved");

  var searchResponse = await search.GetRemainingAsync();
  searchResponse.ForEach((s) = > {
   Console.WriteLine(s.ToString());
  });
}
```

# Usando o nível de serviço do DynamoDB APIs
<a name="dynamodb-integration-lowlevelapi"></a>

O nível de serviço do Dynamo APIs permite que você crie, atualize e exclua tabelas. Você também pode realizar operações típicas de criação, leitura, atualização e exclusão (CRUD) nos itens de uma tabela usando essa API.

## Criação de um cliente DynamoDB
<a name="create-a-dynamodb-client"></a>

Para criar um cliente DynamoDB:

```
AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials,region);
```

## Operações de CRUD
<a name="crud-operations"></a>

### Salvar um item
<a name="save-an-item"></a>

Para salvar um item em uma tabela do DynamoDB:

```
// Create a client
AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials,region);

// Define item attributes
Dictionary<string, AttributeValue> attributes = new Dictionary<string, AttributeValue>();

// Author is hash-key
attributes["Author"] = new AttributeValue { S = "Mark Twain" };
attributes["Title"] = new AttributeValue { S = "The Adventures of Tom Sawyer" };
attributes["PageCount"] = new AttributeValue { N = "275" };
attributes["Price"] = new AttributeValue{N = "10.00"};
attributes["Id"] = new AttributeValue{N="10"};
attributes["ISBN"] = new AttributeValue{S="111-1111111"};

// Create PutItem request
PutItemRequest request = new PutItemRequest
{
    TableName = "Books",
    Item = attributes
};

// Issue PutItem request
var response = await client.PutItemAsync(request);
```

### Recuperação de um item
<a name="retrieve-an-item"></a>

Para recuperar um item:

```
// Create a client
AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials,region);

Dictionary<string, AttributeValue> key = new Dictionary<string, AttributeValue>
{
    { "Id", new AttributeValue { N = "10" } }
};

// Create GetItem request
GetItemRequest request = new GetItemRequest
{
    TableName = "Books",
    Key = key,
};

// Issue request
var result = await client.GetItemAsync(request);

// View response
Console.WriteLine("Item:");
Dictionary<string, AttributeValue> item = result.Item;
foreach (var keyValuePair in item)
{
    Console.WriteLine("Author := {0}", item["Author"]);
    Console.WriteLine("Title := {0}", item["Title"]);
    Console.WriteLine("Price:= {0}", item["Price"]);
    Console.WriteLine("PageCount := {0}", item["PageCount"]);
}
```

### Atualização de um item
<a name="update-an-item"></a>

Para atualizar um item:

```
// Create a client
AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials,region);

Dictionary<string, AttributeValue> key = new Dictionary<string, AttributeValue>
{
    { "Id", new AttributeValue { N = "10" } }
};

// Define attribute updates
Dictionary<string, AttributeValueUpdate> updates = new Dictionary<string, AttributeValueUpdate>();
// Add a new string to the item's Genres SS attribute
updates["Genres"] = new AttributeValueUpdate()
{
    Action = AttributeAction.ADD,
    Value = new AttributeValue { SS = new List<string> { "Bildungsroman" } }
};

// Create UpdateItem request
UpdateItemRequest request = new UpdateItemRequest
{
    TableName = "Books",
    Key = key,
    AttributeUpdates = updates
};

// Issue request
var response = await client.UpdateItemAsync(request);
```

### Exclusão de um item
<a name="delete-an-item"></a>

Para excluir um item:

```
// Create a client
AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials,region);

Dictionary<string, AttributeValue> key = new Dictionary<string, AttributeValue>
{
  { "Id", new AttributeValue { N = "10" } }
};

// Create DeleteItem request
DeleteItemRequest request = new DeleteItemRequest
{
  TableName = "Books",
  Key = key
};

// Issue request
var response = await client.DeleteItemAsync(request);
```

## Consulta e verificação
<a name="query-and-scan"></a>

Para consultar e recuperar todos os livros cujo autor seja "Mark Twain":

```
public void Query(AWSCredentials credentials, RegionEndpoint region) {
  using(var client = new AmazonDynamoDBClient(credentials, region)) {
    var queryResponse = await client.QueryAsync(new QueryRequest() {
      TableName = "Books",
      IndexName = "Author-Title-index",
      KeyConditionExpression = "Author = :v_Id",
      ExpressionAttributeValues = new Dictionary < string, AttributeValue > {
        {
          ":v_Id", new AttributeValue {
            S = "Mark Twain"
          }
        }
      }
    });
    queryResponse.Items.ForEach((i) = > {
      Console.WriteLine(i["Title"].S);
    });

  }
}
```

O código de exemplo de verificação abaixo retorna todos os livros de nossa tabela:

```
public void Scan(AWSCredentials credentials, RegionEndpoint region) {
      using(var client = new AmazonDynamoDBClient(credentials, region)) {
              var queryResponse = client.Scan(new ScanRequest() {
                      TableName = "Books"
              });
              queryResponse.Items.ForEach((i) = > {
                      Console.WriteLine(i["Title"].S);
              });
      }
}
```