AWSの Mobile SDK for Xamarin が、AWS SDK for .NETに含まれるようになりました。このガイドでは、Mobile SDK for Xamarin のアーカイブバージョンについて説明します。
オブジェクト永続性モデルの使用
AWS Mobile SDK for .NET and Xamarin には、クライアント側クラスを DynamoDB テーブルにマッピングできる、オブジェクト永続性モデルが用意されています。各オブジェクトインスタンスが、対応するテーブルの項目にマッピングされます。クライアント側オブジェクトをテーブルに保存するために、オブジェクト永続性モデルでは、DynamoDB のエントリポイントとなる DynamoDBContext クラスを使用できます。このクラスでは、DynamoDB に接続してテーブルにアクセスし、各種の CRUD オペレーションやクエリを実行することができます。
オブジェクト永続性モデルには、テーブルを作成、更新、または削除するための API はありません。データオペレーションだけが可能になっています。テーブルを作成、更新、および削除するには、低レベル API を使用する必要があります。低レベル API の使用方法については、「DynamoDB サービスレベル API を使用する」を参照してください。
概要
オブジェクト永続性モデルには、クライアント側クラスをテーブルにマッピングし、プロパティ/フィールドを属性にマッピングする、属性のセットが用意されています。オブジェクト永続性モデルでは、クラスプロパティとテーブル属性との間で、明示的なマッピングとデフォルトのマッピングの両方がサポートされています。
-
明示的なマッピング: プライマリキーにプロパティをマッピングするには、オブジェクト永続性モデル属性の DynamoDBHashKey および DynamoDBRangeKey を使用する必要があります。さらに、非プライマリキー属性については、クラス内のプロパティ名と、マッピング先の対応するテーブル属性が同じでない場合は、DynamoDBProperty 属性を明示的に追加してマッピングを定義する必要があります。
-
デフォルトのマッピング - デフォルトでは、オブジェクト永続性モデルによって、クラスプロパティがテーブル内の同じ名前の属性にマッピングされます。
すべてのクラスプロパティをマッピングする必要はありません。これらのプロパティを特定するには、DynamoDBIgnore 属性を追加します。オブジェクトのインスタンスを保存して取得すると、この属性でマークされたプロパティはすべて省略されます。
サポートされるデータ型
オブジェクト永続性モデルでは、プリミティブな .NET データ型、コレクション、および任意のデータ型のセットがサポートされています。このモデルでは、次のプリミティブデータ型がサポートされています。
-
ブール
-
バイト
-
char
-
DateTime
-
小数点、倍精度浮動小数点型、浮動小数点型
-
Int16、Int32、Int64
-
SByte
-
文字列
-
UInt16、UInt32、UInt64
オブジェクト永続性モデルでは、次の制限の下で .NET コレクション型もサポートされています。
-
コレクション型は、ICollection インターフェイスを実装する必要があります。
-
コレクション型は、サポートされているプリミティブ型で構成されている必要があります。たとえば、ICollection<string>、ICollection<bool> を参照してください。
-
コレクション型では、パラメータがないコンストラクタを使用できなければなりません。
オブジェクト永続性モデルの詳細については、「.NET オブジェクト永続性モデル」を参照してください。
DynamoDB クライアントの作成
DynamoDB クライアントを作成するには、以下を行います。
var client = new AmazonDynamoDBClient(credentials,region); DynamoDBContext context = new DynamoDBContext(client);
CRUD オペレーション
オブジェクトの保存
オブジェクトを作成します。
[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 };
DynamoDB テーブルにオブジェクトを保存します。
context.Save(myBook);
オブジェクトの取得
オブジェクトを取得するには:
Book retrievedBook = context.Load<Book>(1);
オブジェクトを更新
オブジェクトを更新するには:
Book retrievedBook = context.Load<Book>(1); retrievedBook.ISBN = "111-1111111001"; context.Save(retrievedBook);
オブジェクトの削除
オブジェクトを削除するには:
Book retrievedBook = context.Load<Book>(1); context.Delete(retrievedBook);
クエリおよびスキャン
作成者が「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()); }); }
以下のスキャンのサンプルコードでは、テーブルに含まれるすべての本を返します。
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()); }); }