

適用於 Unity 的 AWS Mobile SDK 現在已包含在 中 適用於 .NET 的 AWS SDK。本指南參考適用於 Unity 的 Mobile SDK 封存版本。如需詳細資訊，請參閱[什麼是適用於 Unity 的 AWS Mobile SDK？](what-is-unity-plugin.md)

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

 [Amazon DynamoDB](https://aws.amazon.com/dynamodb/) 是一種快速、可輕鬆擴展、高度可用、經濟實惠、非關聯式資料庫服務。DynamoDB 會移除資料儲存體的傳統可擴展性限制，同時維持低延遲和可預測的效能。如需 DynamoDB 的相關資訊，請參閱 [Amazon DynamoDB](https://aws.amazon.com/dynamodb/)。

適用於 Unity 的 AWS Mobile SDK 提供高階程式庫，可用於 DynamoDB。您也可以直接對低階 DynamoDB API 提出請求，但對於大多數使用案例，建議使用高階程式庫。AmazonDynamoDBClient 是高階程式庫中特別實用的部分。使用此類別，您可以執行各種建立、讀取、更新和刪除 (CRUD) 操作，以及執行查詢。

**注意**  
本文件中的一些範例假設使用名為 ResultText 的文字方塊變數來顯示追蹤輸出。

## 整合 Amazon DynamoDB
<a name="integrating-amazon-dynamodb"></a>

若要在 Unity 應用程式中使用 DynamoDB，您需要將 Unity 開發套件新增至您的專案。如果您尚未這麼做，請[下載適用於 Unity 的 SDK](https://aws.amazon.com/mobile/sdk/)，並遵循[設定適用於 Unity 的 AWS Mobile SDK](setup-unity.md) 中的指示。建議使用 Amazon Cognito Identity 為您的應用程式提供臨時 AWS 登入資料。這些登入資料可讓您的應用程式存取 AWS 服務和資源。

若要在應用程式中使用 DynamoDB，您必須設定正確的許可。下列 IAM 政策允許使用者刪除、取得、放置、掃描和更新特定 DynamoDB 資料表中的項目，該資料表由 [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:Scan",
        "dynamodb:UpdateItem"
    ],
    "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/MyTable"
}]
}
```

此政策應套用至指派給 Cognito 身分集區的角色，但您需要將 **`Resource`**值取代為 DynamoDB 資料表的正確 ARN。Cognito 會自動為您的新身分集區建立角色，您可以在 [IAM 主控台](https://console.aws.amazon.com/iam/)將政策套用至此角色。

您應該根據應用程式的需求新增或移除允許的動作。若要進一步了解 IAM 政策，請參閱[使用 IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM_Introduction.html)。若要進一步了解 DynamoDB 特定政策，請參閱[使用 IAM 控制對 DynamoDB 資源的存取](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/UsingIAMWithDDB.html)。

## 建立 DynamoDB 資料表
<a name="create-a-dynamodb-table"></a>

現在我們已設定許可和登入資料，讓我們為應用程式建立 DynamoDB 資料表。若要建立資料表，請前往 [DynamoDB 主控台](https://console.aws.amazon.com/dynamodb/home)並遵循下列步驟：

1. 按一下 **Create Table (建立資料表)**。

1. 輸入 `Bookstore`做為資料表的名稱。

1. 選取**雜湊**做為主索引鍵類型。

1. 選取**數字**並`id`輸入雜湊屬性名稱。按一下 **Continue (繼續)**。

1. 再次按一下**繼續**以略過新增索引。

1. 將讀取容量設定為 `10`，將寫入容量設定為 `5`。按一下 **Continue (繼續)**。

1. 輸入通知電子郵件，然後按一下**繼續**以建立輸送量警示。

1. 按一下 **Create (建立)**。DynamoDB 將建立您的資料庫。

## 建立 DynamoDB 用戶端
<a name="create-a-dynamodb-client"></a>

若要讓應用程式與 DynamoDB 資料表互動，我們需要用戶端。我們可以建立預設 DynamodDB 用戶端，如下所示：

```
var credentials = new CognitoAWSCredentials(IDENTITY_POOL_ID, RegionEndpoint.USEast1);
AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials);
DynamoDBContext Context = new DynamoDBContext(client);
```

AmazonDynamoDBClient 類別是 DynamoDB API 的進入點。類別提供執行個體方法來建立、描述、更新和刪除資料表，以及其他操作。內容會在用戶端上新增另一層抽象，並可讓您使用其他功能，例如物件持久性模型。

## 描述資料表
<a name="describe-a-table"></a>

若要取得 DynamoDB 資料表的描述，我們可以使用以下程式碼：

```
resultText.text +=("\n*** Retrieving table information ***\n");
       var request = new DescribeTableRequest
       {
           TableName = @"ProductCatalog"
       };
       Client.DescribeTableAsync(request, (result) =>
       {
               if (result.Exception != null)
               {
                       resultText.text += result.Exception.Message;
                       Debug.Log(result.Exception);
                       return;
               }
               var response = result.Response;
               TableDescription description = response.Table;
               resultText.text += ("Name: " + description.TableName + "\n");
               resultText.text += ("# of items: " + description.ItemCount + "\n");
               resultText.text += ("Provision Throughput (reads/sec): " +
                   description.ProvisionedThroughput.ReadCapacityUnits + "\n");
               resultText.text += ("Provision Throughput (reads/sec): " +
                   description.ProvisionedThroughput.WriteCapacityUnits + "\n");

       }, null);
   }
```

在此範例中，我們會建立用戶端和 DescribeTableRequest 物件，將資料表的名稱指派給 ** `TableName` ** 屬性，然後將請求物件傳遞至 AmazonDynamoDBClient 物件上的 DescribeTableAsync 方法。DescribeTableAsync 也會接受委派，在非同步操作完成時呼叫該委派。

**注意**  
AmazonDynamoDBClient 上的所有非同步方法都會接受非同步操作完成時呼叫的委派。

## 儲存物件
<a name="save-an-object"></a>

若要將物件儲存至 DynamoDB，請使用 AmazonDynamoDBClient 物件的 SaveAsync<T> 方法，其中 T 是您儲存的物件類型。

我們稱之為資料庫「書店」，為了符合該主題，我們將實作記錄書本相關屬性的資料模型。以下是定義資料模型的類別。

```
[DynamoDBTable("ProductCatalog")]
    public class Book
    {
        [DynamoDBHashKey]   // Hash key.
        public int Id { get; set; }
        [DynamoDBProperty]
        public string Title { get; set; }
        [DynamoDBProperty]
        public string ISBN { get; set; }
        [DynamoDBProperty("Authors")]    // Multi-valued (set type) attribute.
        public List<string> BookAuthors { get; set; }
    }
```

當然，對於真實的書店應用程式，我們需要其他欄位，才能用於作者和價格等項目。Book 類別以 【DynamoDBTable】 屬性裝飾，這會定義 Book 將寫入的資料庫資料表物件類型。Book 類別的每個執行個體的金鑰都是使用 【DynamoDBHashKey】 屬性來識別。屬性是以 【DynamoDBProperty】 屬性識別，這些屬性會指定要寫入屬性之資料庫資料表中的資料欄。模型就位後，我們可以編寫一些方法來建立、擷取、更新和刪除 Book 物件。

## 建立書籍
<a name="create-a-book"></a>

```
private void PerformCreateOperation()
{
    Book myBook = new Book
    {
        Id = bookID,
        Title = "object persistence-AWS SDK for.NET SDK-Book 1001",
        ISBN = "111-1111111001",
        BookAuthors = new List<string> { "Author 1", "Author 2" },
    };

    // Save the book.
    Context.SaveAsync(myBook,(result)=>{
        if(result.Exception == null)
            resultText.text += @"book saved";
    });
}
```

## 擷取書籍
<a name="retrieve-a-book"></a>

```
private void RetrieveBook()
{
    this.displayMessage += "\n*** Load book**\n";
    Context.LoadAsync<Book>(bookID,
                             (AmazonDynamoResult<Book> result) =>
    {
        if (result.Exception != null)
        {

            this.displayMessage += ("LoadAsync error" +result.Exception.Message);
            Debug.LogException(result.Exception);
            return;
        }
        _retrievedBook = result.Response;
        this.displayMessage += ("Retrieved Book: " +
                                "\nId=" + _retrievedBook.Id +
                                "\nTitle=" + _retrievedBook.Title +
                                "\nISBN=" + _retrievedBook.ISBN);
        string authors = "";
        foreach(string author in _retrievedBook.BookAuthors)
            authors += author + ",";
        this.displayMessage += "\nBookAuthor= "+ authors;
        this.displayMessage += ("\nDimensions= "+ _retrievedBook.Dimensions.Length + " X " +
                                _retrievedBook.Dimensions.Height + " X " +
                                _retrievedBook.Dimensions.Thickness);

    }, null);
}
```

## 更新書籍
<a name="update-a-book"></a>

```
private void PerformUpdateOperation()
{
    // Retrieve the book.
    Book bookRetrieved = null;
    Context.LoadAsync<Book>(bookID,(result)=>
    {
        if(result.Exception == null )
        {
            bookRetrieved = result.Result as Book;
            // Update few properties.
            bookRetrieved.ISBN = "222-2222221001";
            // Replace existing authors list with this
            bookRetrieved.BookAuthors = new List<string> { "Author 1", "Author x" };
            Context.SaveAsync<Book>(bookRetrieved,(res)=>
            {
                if(res.Exception == null)
                     resultText.text += ("\nBook updated");
            });
        }
   });
}
```

## 刪除書籍
<a name="delete-a-book"></a>

```
private void PerformDeleteOperation()
{
    // Delete the book.
    Context.DeleteAsync<Book>(bookID,(res)=>
    {
        if(res.Exception == null)
        {
            Context.LoadAsync<Book>(bookID,(result)=>
            {
                 Book deletedBook = result.Result;
                 if(deletedBook==null)
                     resultText.text += ("\nBook is deleted");
            });
        }
   });
}
```