

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# クライアント間でのデータの同期
<a name="synchronizing-data"></a>

****  
Amazon Cognito Sync を初めて使用する場合は、[AWS AppSync](https://aws.amazon.com/appsync/) を使用してください。Amazon Cognito Sync と同様に、 AWS AppSync はデバイス間でアプリケーションデータを同期するためのサービスです。  
このサービスは、アプリの設定やゲームステートといったユーザーデータの同期化を可能にします。また、複数のユーザーが同期し、共有されたデータでリアルタイムにコラボレートできるようにすることで、これらの機能を拡張します。

Amazon Cognito では、キーバリューペアが含まれるデータセットにユーザーデータを保存することができます。Amazon Cognito は、このデータを ID プールの ID と関連付け、アプリがログインやデバイス全体でアクセスできるようにします。このデータを Amazon Cognito サービスとエンドユーザーのデバイス間で同期するには、同期メソッドを呼び出します。ｑ 各データセットは、最大 1 MB のサイズにすることができます。ID には、最大 20 個のデータセットを関連付けることができます。

Amazon Cognito Sync クライアントは、ID データ用のローカルキャッシュを作成します。アプリは、キーを読み取るか書き込むときに、このローカルキャッシュとやり取りします。このやり取りにより、オフラインの状態でも、デバイス上で行われたすべての変更がすぐに利用できるようになることが保証されます。同期メソッドが呼び出された場合、サービスからの変更はデバイスにプルされ、ローカルの変更はサービスにプッシュされます。この時点で、他のデバイスが変更を利用して同期できるようになります。

## Amazon Cognito Sync クライアントの初期化
<a name="initializing-client"></a>

Amazon Cognito Sync クライアントを初期化するには、まず認証情報プロバイダーを作成する必要があります。認証情報プロバイダーは一時的な AWS 認証情報を取得して、アプリが AWS リソースにアクセスできるようにします。また、必要なヘッダーファイルをインポートする必要があります。以下のステップを使用して、Amazon Cognito Sync クライアントを初期化します。

### Android
<a name="initialize-cog-sync-1.android"></a>

1. 「[認証情報の取得](getting-credentials.md)」の指示に従って、認証情報プロバイダーを作成します。

1. Amazon Cognito パッケージを以下のようにインポートします: `import com.amazonaws.mobileconnectors.cognito.*;`

1. Amazon Cognito Sync を初期化 以下のように、Android アプリのコンテキスト、ID プールのID、 AWS リージョン、および初期化された Amazon Cognito の認証情報プロバイダーを渡します。

   ```
   CognitoSyncManager client = new CognitoSyncManager(
       getApplicationContext(),
       Regions.YOUR_REGION,
       credentialsProvider);
   ```

### iOS - Objective-C
<a name="initialize-cog-sync-1.ios-objc"></a>

1. 「[認証情報の取得](getting-credentials.md)」の指示に従って、認証情報プロバイダーを作成します。

1. 以下のように、`AWSCore` および `Cognito` をインポートし、`AWSCognito` を初期化します。

   ```
   #import <AWSiOSSDKv2/AWSCore.h>
   #import <AWSCognitoSync/Cognito.h>
   
   AWSCognito *syncClient = [AWSCognito defaultCognito];
   ```

1. CocoaPods を使用している場合は、`<AWSiOSSDKv2/AWSCore.h>` を `AWSCore.h` と置き換えてください。Amazon Cognito のインポートにも同じ構文に従います。

### iOS - Swift
<a name="initialize-cog-sync-1.ios-swift"></a>

1. 「[認証情報の取得](getting-credentials.md)」の指示に従って、認証情報プロバイダーを作成します。

1. 以下のように `AWSCognito` をインポートし、初期化します。

   ```
   import AWSCognito
   let syncClient = AWSCognito.default()!
   ```

### JavaScript
<a name="initialize-cog-sync-1.javascript"></a>

1. [Amazon Cognito Sync Manager for JavaScript](https://github.com/aws/amazon-cognito-js) をダウンロードします。

1. プロジェクトに Sync Manager ライブラリを含めます。

1. 「[認証情報の取得](getting-credentials.md)」の指示に従って、認証情報プロバイダーを作成します。

1. Sync Manager を以下のように初期化します。

   ```
   var syncManager = new AWS.CognitoSyncManager();
   ```

### Unity
<a name="initialize-cog-sync-1.unity"></a>

1. 「[認証情報の取得](getting-credentials.md)」の指示に従って、`CognitoAWSCredentials` のインスタンスを作成します。

1. `CognitoSyncManager` のインスタンスを作成します。以下のように、`CognitoAwsCredentials` オブジェクトと `AmazonCognitoSyncConfig` を渡し、少なくともリージョン・セットを含めます。

   ```
   AmazonCognitoSyncConfig clientConfig = new AmazonCognitoSyncConfig { RegionEndpoint = REGION };
   CognitoSyncManager syncManager = new CognitoSyncManager(credentials, clientConfig);
   ```

### Xamarin
<a name="initialize-cog-sync-1.xamarin"></a>

1. 「[認証情報の取得](getting-credentials.md)」の指示に従って、`CognitoAWSCredentials` のインスタンスを作成します。

1. `CognitoSyncManager` のインスタンスを作成します。以下のように、`CognitoAwsCredentials` オブジェクトと `AmazonCognitoSyncConfig` を渡し、少なくともリージョン・セットを含めます。

   ```
   AmazonCognitoSyncConfig clientConfig = new AmazonCognitoSyncConfig { RegionEndpoint = REGION };
   CognitoSyncManager syncManager = new CognitoSyncManager(credentials, clientConfig);
   ```

## データセットについて
<a name="understanding-datasets"></a>



Amazon Cognito は、ユーザーのプロファイルデータをデータセットに編成します。各データセットはキーバリューペアの形式で、最大 1 MB のデータを含むことができます。データセットは、同期することができる最も細かいエンティティです。データセットで実行される読み取りと書き込みのオペレーションは、同期メソッドが呼び出されるまでしか、ローカルストアに影響しません。Amazon Cognito は一意の文字列によってデータセットを識別します。以下のように新しいデータセットを作成するか、既存のデータセットを開くことができます。

### Android
<a name="understanding-datasets-1.android"></a>

```
Dataset dataset = client.openOrCreateDataset("datasetname");
```

データセットを削除するには、以下のように、最初にそれをローカルストレージから削除するためのメソッドを呼び出し、次に `synchronize` メソッドを呼び出して Amazon Cognito からそのデータセットを削除します。

```
dataset.delete();
dataset.synchronize(syncCallback);
```

### iOS - Objective-C
<a name="understanding-datasets-1.ios-objc"></a>

```
AWSCognitoDataset *dataset = [syncClient openOrCreateDataset:@"myDataSet"];
```

データセットを削除するには、以下のように、最初にそれをローカルストレージから削除するためのメソッドを呼び出し、次に `synchronize` メソッドを呼び出して Amazon Cognito からそのデータセットを削除します。

```
[dataset clear];
[dataset synchronize];
```

### iOS - Swift
<a name="understanding-datasets-1.ios-swift"></a>

```
let dataset = syncClient.openOrCreateDataset("myDataSet")!
```

データセットを削除するには、最初にそれをローカルストレージから削除するためのメソッドを呼び出し、次に `synchronize` メソッドを呼び出して Amazon Cognito からそのデータセットを削除します。

```
dataset.clear()
dataset.synchronize()
```

### JavaScript
<a name="understanding-datasets-1.javascript"></a>

```
syncManager.openOrCreateDataset('myDatasetName', function(err, dataset) {
   // ...
});
```

### Unity
<a name="understanding-datasets-1.unity"></a>

```
string myValue = dataset.Get("myKey");
dataset.Put("myKey", "newValue");
```

データセットからキーを削除するには、以下のように `Remove` を設定します。

```
dataset.Remove("myKey");
```

### Xamarin
<a name="understanding-datasets-1.xamarin"></a>

```
Dataset dataset = syncManager.OpenOrCreateDataset("myDatasetName");
```

データセットを削除するには、以下のように、最初にそれをローカルストレージから削除するためのメソッドを呼び出し、次に `synchronize` メソッドを呼び出して Amazon Cognito からそのデータセットを削除します。

```
dataset.Delete();
dataset.SynchronizeAsync();
```

## データセットのデータの読み取りと書き込み
<a name="reading-and-writing-data"></a>

Amazon Cognito データセットはディクショナリとして機能し、値はキーでアクセスできます。データセットのキーと値は、データセットがディクショナリであるかのように読み取り、追加、または変更できます。

データセットに書き込む値は、同期メソッドを呼び出すまで、データのローカルにキャッシュされたコピーのみに影響することに注意してください。

### Android
<a name="reading-and-writing-data-1.android"></a>

```
String value = dataset.get("myKey");
dataset.put("myKey", "my value");
```

### iOS - Objective-C
<a name="reading-and-writing-data-1.ios-objc"></a>

```
[dataset setString:@"my value" forKey:@"myKey"];
NSString *value = [dataset stringForKey:@"myKey"];
```

### iOS - Swift
<a name="reading-and-writing-data-1.ios-swift"></a>

```
dataset.setString("my value", forKey:"myKey")
let value = dataset.stringForKey("myKey")
```

### JavaScript
<a name="reading-and-writing-data-1.javascript"></a>



```
dataset.get('myKey', function(err, value) {
  console.log('myRecord: ' + value);
});

dataset.put('newKey', 'newValue', function(err, record) {
  console.log(record);
});

dataset.remove('oldKey', function(err, record) {
  console.log(success);
});
```

### Unity
<a name="reading-and-writing-data-1.unity"></a>

```
string myValue = dataset.Get("myKey");
dataset.Put("myKey", "newValue");
```

### Xamarin
<a name="reading-and-writing-data-1.xamarin"></a>



```
//obtain a value
string myValue = dataset.Get("myKey");

// Create a record in a dataset and synchronize with the server
dataset.OnSyncSuccess += SyncSuccessCallback;
dataset.Put("myKey", "myValue");
dataset.SynchronizeAsync();

void SyncSuccessCallback(object sender, SyncSuccessEventArgs e) {
  // Your handler code here
}
```

### Android
<a name="reading-and-writing-data-2.android"></a>

以下のように、`remove` メソッドを使用して、データセットからキーを削除できます。

```
dataset.remove("myKey");
```

### iOS - Objective-C
<a name="reading-and-writing-data-2.ios-objc"></a>

データセットからキーを削除するには、以下のように `removeObjectForKey` を設定します。

```
[dataset removeObjectForKey:@"myKey"];
```

### iOS - Swift
<a name="reading-and-writing-data-2.ios-swift"></a>

データセットからキーを削除するには、以下のように `removeObjectForKey` を設定します。

```
dataset.removeObjectForKey("myKey")
```

### Unity
<a name="reading-and-writing-data-2.unity"></a>

データセットからキーを削除するには、以下のように `Remove` を設定します。

```
dataset.Remove("myKey");
```

### Xamarin
<a name="reading-and-writing-data-2.xamarin"></a>

`Remove` を使用して、データセットからキーを削除できます。

```
dataset.Remove("myKey");
```

## 同期ストアでのローカルデータの同期
<a name="synchronizing-local-data"></a>



### Android
<a name="synchronizing-local-data-1.android"></a>

`synchronize` メソッドは、ローカルキャッシュデータと Amazon Cognito Sync ストアに格納されたデータを比較します。リモート変更は Amazon Cognito Sync ストアからプルされ、競合が発生した場合は競合解決が呼び出されます。そして、デバイス上の更新された値がサービスにプッシュされます。データセットを同期するには、その `synchronize` メソッドを呼び出します。

```
dataset.synchronize(syncCallback);
```

`synchronize` メソッドは、以下に説明する `SyncCallback` インターフェイスの実装を受け取ります。

`synchronizeOnConnectivity()` メソッドは、接続が利用可能な場合に同期を試みます。接続が直ちに利用可能な場合、`synchronizeOnConnectivity()` は `synchronize()` のように動作します。それ以外の場合、接続の変更をモニタリングし、接続が利用可能になると同期を実行します。`synchronizeOnConnectivity()` が複数回呼び出された場合、最後の同期リクエストのみが保持され、最後のコールバックのみが実行されます。データセットまたはコールバックがガーベージコレクションの対象になった場合、このメソッドは同期を実行せず、コールバックは実行されません。

データセットの同期と、さまざまなコールバックに関する詳細については、「[イベントコールバックの処理](handling-callbacks.md)」を参照してください。

### iOS - Objective-C
<a name="synchronizing-local-data-1.ios-objc"></a>

`synchronize` メソッドは、ローカルキャッシュデータと Amazon Cognito Sync ストアに格納されたデータを比較します。リモート変更は Amazon Cognito Sync ストアからプルされ、競合が発生した場合は競合解決が呼び出されます。そして、デバイス上の更新された値がサービスにプッシュされます。データセットを同期するには、その `synchronize` メソッドを呼び出します。

`synchronize` メソッドは非同期で、応答を処理するために `AWSTask` オブジェクトを返します。

```
[[dataset synchronize] continueWithBlock:^id(AWSTask *task) {
    if (task.isCancelled) {
        // Task cancelled.
    } else if (task.error) {
        // Error while executing task.
    } else {
        // Task succeeded. The data was saved in the sync store.
    }
    return nil;
}];
```

`synchronizeOnConnectivity` メソッドは、デバイスが接続されているときに同期を試みます。最初に、`synchronizeOnConnectivity` は接続を確認し、デバイスがオンラインである場合、すぐに synchronize を呼び出して、試行に関連付けられた `AWSTask` オブジェクトを返します。

デバイスがオフラインの場合、`synchronizeOnConnectivity` は、1) 次回にデバイスがオンラインになったときに同期をスケジュールし、2) 結果が nil の `AWSTask` を返します。スケジュールされた同期が有効なのは、データセットオブジェクトのライフサイクルの間のみです。接続が回復する前にアプリが終了された場合、データは同期されません。予定された同期中にイベントが発生した場合に通知を受けるようにする場合は、`AWSCognito` で見つかった通知のオブザーバーを追加する必要があります。

データセットの同期と、さまざまなコールバックに関する詳細については、「[イベントコールバックの処理](handling-callbacks.md)」を参照してください。

### iOS - Swift
<a name="synchronizing-local-data-1.ios-swift"></a>

`synchronize` メソッドは、ローカルキャッシュデータと Amazon Cognito Sync ストアに格納されたデータを比較します。リモート変更は Amazon Cognito Sync ストアからプルされ、競合が発生した場合は競合解決が呼び出されます。そして、デバイス上の更新された値がサービスにプッシュされます。データセットを同期するには、その `synchronize` メソッドを呼び出します。

`synchronize` メソッドは非同期で、応答を処理するために `AWSTask` オブジェクトを返します。

```
dataset.synchronize().continueWith(block: { (task) -> AnyObject? in

            if task.isCancelled {
                // Task cancelled.
            } else if task.error != nil {
                // Error while executing task
            } else {
                // Task succeeded. The data was saved in the sync store.
            }
            return task
})
```

`synchronizeOnConnectivity` メソッドは、デバイスが接続されているときに同期を試みます。最初に、`synchronizeOnConnectivity` は接続を確認し、デバイスがオンラインである場合、すぐに `synchronize` を呼び出して、試行に関連付けられた `AWSTask` オブジェクトを返します。

デバイスがオフラインの場合、`synchronizeOnConnectivity` は、1) 次回にデバイスがオンラインになったときに同期をスケジュールし、2) 結果が nil の `AWSTask` オブジェクトを返します。スケジュールされた同期が有効なのは、データセットオブジェクトのライフサイクルの間のみです。接続が回復する前にアプリが終了された場合、データは同期されません。予定された同期中にイベントが発生した場合に通知を受けるようにする場合は、`AWSCognito` で見つかった通知のオブザーバーを追加する必要があります。

データセットの同期と、さまざまなコールバックに関する詳細については、「[イベントコールバックの処理](handling-callbacks.md)」を参照してください。

### JavaScript
<a name="synchronizing-local-data-1.javascript"></a>

`synchronize` メソッドは、ローカルキャッシュデータと Amazon Cognito Sync ストアに格納されたデータを比較します。リモート変更は Amazon Cognito Sync ストアからプルされ、競合が発生した場合は競合解決が呼び出されます。そして、デバイス上の更新された値がサービスにプッシュされます。データセットを同期するには、その `synchronize` メソッドを呼び出します。

```
dataset.synchronize();
```

データセットの同期と、さまざまなコールバックに関する詳細については、「[イベントコールバックの処理](handling-callbacks.md)」を参照してください。

### Unity
<a name="synchronizing-local-data-1.unity"></a>

同期メソッドは、ローカルキャッシュデータと Amazon Cognito Sync ストアに格納されたデータを比較します。リモート変更は Amazon Cognito Sync ストアからプルされ、競合が発生した場合は競合解決が呼び出されます。そして、デバイス上の更新された値がサービスにプッシュされます。データセットを同期するには、その `synchronize` メソッドを呼び出します。

```
dataset.Synchronize();
```

同期は非同期で実行され、データセット内で指定できる複数のコールバックの 1 つを呼び出します。

データセットの同期と、さまざまなコールバックに関する詳細については、「[イベントコールバックの処理](handling-callbacks.md)」を参照してください。

### Xamarin
<a name="synchronizing-local-data-1.xamarin"></a>

`synchronize` メソッドは、ローカルキャッシュデータと Amazon Cognito Sync ストアに格納されたデータを比較します。リモート変更は Amazon Cognito Sync ストアからプルされ、競合が発生した場合は競合解決が呼び出されます。そして、デバイス上の更新された値がサービスにプッシュされます。データセットを同期するには、その `synchronize` メソッドを呼び出します。

```
dataset.SynchronizeAsync();
```

データセットの同期と、さまざまなコールバックに関する詳細については、「[イベントコールバックの処理](handling-callbacks.md)」を参照してください。