

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

# イベントコールバックの処理
<a name="handling-callbacks"></a>

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

Amazon Cognito Sync デベロッパーとして、さまざまなコールバックを実装して、さまざまな同期イベントやシナリオを処理できます。Android SDK の `SyncCallback` インターフェイスは、データセットが正常にダウンロードされたときの `onSuccess()`、例外が発生したときの `onFailure()`、ローカルデータとリモートデータの間の競合を解決するための `onConflict()` などの、データセットの同期に関する通知を設定します。

iOS SDK では、`AWSCognitoDidStartSynchronizeNotification` などの同様の通知に登録し、`AWSCognitoRecordConflictHandler` などのハンドラーを設定して競合を解決できます。JavaScript、Unity、Xamarin のプラットフォームには、同様のコールバックメカニズムがあります。これらのコールバックを実装すると、アプリケーションは Amazon Cognito Sync の使用時に発生する可能性のあるさまざまな同期イベントやシナリオを正常に処理できます。

## Android
<a name="handling-callbacks-1.android"></a>

**SyncCallback インターフェイス**

`SyncCallback` インターフェイスを実装することで、データセットの同期に関するアプリの通知を受け取ることができます。これによりアプリは、ローカルデータの削除、認証されていないプロファイルや認証されたプロファイルの結合、同期の競合の解決に関するアクティブな決定ができます。インターフェイスで必要となる次のメソッドを実装する必要があります。
+ `onSuccess()`
+ `onFailure()`
+ `onConflict()`
+ `onDatasetDeleted()`
+ `onDatasetsMerged()`

すべてのコールバックを指定しない場合は、すべてのコールバックに対して空のデフォルト実装を提供する、`DefaultSyncCallback` クラスを使用することもできます。

**onSuccess**

`onSuccess()` コールバックは、同期ストアから正常にデータセットをダウンロードしたときにトリガーされます。

```
@Override
public void onSuccess(Dataset dataset, List<Record> newRecords) {
}
```

**onFailure**

onFailure() は、同期中に例外が発生した場合に呼び出されます。

```
@Override
public void onFailure(DataStorageException dse) {
}
```

**onConflict**

ローカルストアと同期ストアで同じキーが変更された場合に、競合が発生する可能性があります。`onConflict()` メソッドは、競合の解決を処理します。このメソッドを実装しない場合、Amazon Cognito Sync クライアントはデフォルトで最新の変更を使用します。

```
@Override
public boolean onConflict(Dataset dataset, final List<SyncConflict> conflicts) {
    List<Record> resolvedRecords = new ArrayList<Record>();
    for (SyncConflict conflict : conflicts) {
        /* resolved by taking remote records */
        resolvedRecords.add(conflict.resolveWithRemoteRecord());

        /* alternately take the local records */
        // resolvedRecords.add(conflict.resolveWithLocalRecord());

        /* or customer logic, say concatenate strings */
        // String newValue = conflict.getRemoteRecord().getValue()
        //     + conflict.getLocalRecord().getValue();
        // resolvedRecords.add(conflict.resolveWithValue(newValue);
    }
    dataset.resolve(resolvedRecords);

    // return true so that synchronize() is retried after conflicts are resolved
    return true;
}
```

**onDatasetDeleted**

データセットが削除されると、Amazon Cognito クライアントは `SyncCallback` インターフェイスを使用して、データセットのローカルキャッシュコピーも削除されるべきかどうかを確認します。`onDatasetDeleted()` メソッドを実装して、クライアント SDK にローカルデータの処理方法を指定します。

```
@Override
public boolean onDatasetDeleted(Dataset dataset, String datasetName) {
    // return true to delete the local copy of the dataset
    return true;
}
```

**onDatasetMerged**

以前に接続されていない 2 つの ID がリンクされ、すべてのデータセットが結合されます。アプリケーションは、`onDatasetsMerged()` メソッドを通じて結合について通知されます。

```
@Override
public boolean onDatasetsMerged(Dataset dataset, List<String> datasetNames) {
    // return false to handle Dataset merge outside the synchronization callback
    return false;
}
```

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

**同期の通知**

Amazon Cognito クライアントは、同期コール中に多数の `NSNotification` イベントを生成します。標準の `NSNotificationCenter` を通じて、これらの通知をモニタリングするよう登録できます。

```
[NSNotificationCenter defaultCenter]
  addObserver:self
  selector:@selector(myNotificationHandler:)
  name:NOTIFICATION_TYPE
  object:nil];
```

Amazon Cognito は、以下にリストされている 5 つの通知タイプをサポートします。

**AWSCognitoDidStartSynchronizeNotification**

同期操作の開始中に呼び出されます。`userInfo` は、同期されているデータセットの名前であるキーデータセットを含みます。

**AWSCognitoDidEndSynchronizeNotification**

同期操作が完了した (正常またはその反対) ときに呼び出されます。`userInfo` は、同期されているデータセットの名前であるキーデータセットを含みます。

**AWSCognitoDidFailToSynchronizeNotification**

同期操作が失敗すると呼び出されます。`userInfo` は、同期されているデータセットの名前であるキーデータセットと、失敗の原因となったエラーを含むキーエラーを含みます。

**AWSCognitoDidChangeRemoteValueNotification**

ローカル変更が Amazon Cognito に正常にプッシュされたときに呼び出されます。`userInfo` は、同期されているデータセットの名前であるキーデータセットと、プッシュされたレコードキーの NSArray を含むキーを含みます。

**AWSCognitoDidChangeLocalValueFromRemoteNotification**

ローカルの値が同期操作が原因で変更されたときに呼び出されます。`userInfo` は、同期されているデータセットの名前であるキーデータセットと、変更されたレコードキーの NSArray を含むキーを含みます。

**競合解決ハンドラ**

同期操作中に、ローカルストアと同期ストアで同じキーが変更された場合、競合が発生する可能性があります。競合解決ハンドラを設定していない場合、Amazon Cognito はデフォルトで最新の更新を選択します。

AWSCognitoRecordConflictHandler を実装して割り当てることで、デフォルトの競合解決は変更できます。AWSCognitoConflict 入力パラメータには、ローカルにキャッシュされたデータと、同期ストアの競合するレコードの両方の AWSCognitoRecord オブジェクトが含まれています。AWSCognitoConflict を使用すると、ローカルレコード [conflict resolveWithLocalRecord]、リモートレコード [conflict resolveWithRemoteRecord]、またはまったく新しい値 [conflict resolveWithValue:value] との競合を解決できます。このメソッドから nil が返されると、同期は続行できなくなり、次回に同期処理が開始されると、競合が再び発生します。

クライアントレベルで競合解決ハンドラを設定できます。

```
client.conflictHandler = ^AWSCognitoResolvedConflict* (NSString *datasetName, AWSCognitoConflict *conflict) {
    // always choose local changes
    return [conflict resolveWithLocalRecord];
};
```

または、データセットレベルで設定できます。

```
dataset.conflictHandler = ^AWSCognitoResolvedConflict* (NSString *datasetName, AWSCognitoConflict *conflict) {
    // override and always choose remote changes
    return [conflict resolveWithRemoteRecord];
};
```

**データセットが削除されたハンドラ**

データセットが削除されると、Amazon Cognito クライアントは `AWSCognitoDatasetDeletedHandler` を使用して、データセットのローカルキャッシュコピーも削除されるべきかどうかを確認します。`AWSCognitoDatasetDeletedHandler` が実装されていない場合、ローカルデータは自動的に消去されます。消去する前にローカルデータのコピーを維持するか、ローカルデータを維持する場合は、`AWSCognitoDatasetDeletedHandler` を実装します。

クライアントレベルでデータセットが削除されたハンドラを設定することができます。

```
client.datasetDeletedHandler = ^BOOL (NSString *datasetName) {
    // make a backup of the data if you choose
    ...
    // delete the local data (default behavior)
    return YES;
};
```

または、データセットレベルで設定できます。

```
dataset.datasetDeletedHandler = ^BOOL (NSString *datasetName) {
    // override default and keep the local data
    return NO;
};
```

**データセットの結合ハンドラ**

以前に接続されていない 2 つの ID がリンクされ、すべてのデータセットが結合されます。アプリケーションは、`DatasetMergeHandler` メソッドを通じて結合について通知されます。ハンドラは、ルートデータセットの名前と、ルートデータセットの結合としてマーキングされているデータセット名の配列を受け取ります。

`DatasetMergeHandler` が実装されていない場合、これらのデータセットは無視されますが、ID の最大 20 個の合計データセットで引き続き領域を占有します。

クライアントレベルでデータセット結合ハンドラをセットアップすることもできます。

```
client.datasetMergedHandler = ^(NSString *datasetName, NSArray *datasets) {
    // Blindly delete the datasets
    for (NSString *name in datasets) {
        AWSCognitoDataset *merged = [[AWSCognito defaultCognito] openOrCreateDataset:name];
       [merged clear];
       [merged synchronize];
    }
};
```

または、データセットレベルで設定できます。

```
dataset.datasetMergedHandler = ^(NSString *datasetName, NSArray *datasets) {
    // Blindly delete the datasets
    for (NSString *name in datasets) {
        AWSCognitoDataset *merged = [[AWSCognito defaultCognito] openOrCreateDataset:name];
        // do something with the data if it differs from existing dataset
        ...
        // now delete it
        [merged clear];
        [merged synchronize];
    }
};
```

## iOS - Swift
<a name="handling-callbacks-1.ios-swift"></a>

**同期の通知**

Amazon Cognito クライアントは、同期コール中に多数の `NSNotification` イベントを生成します。標準の `NSNotificationCenter` を通じて、これらの通知をモニタリングするよう登録できます。

```
NSNotificationCenter.defaultCenter().addObserver(observer: self,
   selector: "myNotificationHandler",
   name:NOTIFICATION_TYPE,
   object:nil)
```

Amazon Cognito は、以下にリストされている 5 つの通知タイプをサポートします。

**AWSCognitoDidStartSynchronizeNotification**

同期操作の開始中に呼び出されます。`userInfo` は、同期されているデータセットの名前であるキーデータセットを含みます。

**AWSCognitoDidEndSynchronizeNotification**

同期操作が完了した (正常またはその反対) ときに呼び出されます。`userInfo` は、同期されているデータセットの名前であるキーデータセットを含みます。

**AWSCognitoDidFailToSynchronizeNotification**

同期操作が失敗すると呼び出されます。`userInfo` は、同期されているデータセットの名前であるキーデータセットと、失敗の原因となったエラーを含むキーエラーを含みます。

**AWSCognitoDidChangeRemoteValueNotification**

ローカル変更が Amazon Cognito に正常にプッシュされたときに呼び出されます。`userInfo` は、同期されているデータセットの名前であるキーデータセットと、プッシュされたレコードキーの NSArray を含むキーを含みます。

**AWSCognitoDidChangeLocalValueFromRemoteNotification**

ローカルの値が同期操作が原因で変更されたときに呼び出されます。`userInfo` は、同期されているデータセットの名前であるキーデータセットと、変更されたレコードキーの NSArray を含むキーを含みます。

**競合解決ハンドラ**

同期操作中に、ローカルストアと同期ストアで同じキーが変更された場合、競合が発生する可能性があります。競合解決ハンドラを設定していない場合、Amazon Cognito はデフォルトで最新の更新を選択します。

`AWSCognitoRecordConflictHandler` を実装して割り当てることで、デフォルトの競合解決は変更できます。`AWSCognitoConflict` 入力パラメータには、ローカルにキャッシュされたデータと、同期ストアの競合するレコードの両方の `AWSCognitoRecord` オブジェクトが含まれています。`AWSCognitoConflict` を使用すると、ローカルレコード [conflict resolveWithLocalRecord]、リモートレコード [conflict resolveWithRemoteRecord]、またはまったく新しい値 [conflict resolveWithValue:value] との競合を解決できます。このメソッドから nil が返されると、同期は続行できなくなり、次回に同期処理が開始されると、競合が再び発生します。

クライアントレベルで競合解決ハンドラを設定できます。

```
client.conflictHandler = {
    (datasetName: String?, conflict: AWSCognitoConflict?) -> AWSCognitoResolvedConflict? in
    return conflict.resolveWithLocalRecord()
}
```

または、データセットレベルで設定できます。

```
dataset.conflictHandler = {
    (datasetName: String?, conflict: AWSCognitoConflict?) -> AWSCognitoResolvedConflict? in
    return conflict.resolveWithLocalRecord()
}
```

**データセットが削除されたハンドラ**

データセットが削除されると、Amazon Cognito クライアントは `AWSCognitoDatasetDeletedHandler` を使用して、データセットのローカルキャッシュコピーも削除されるべきかどうかを確認します。`AWSCognitoDatasetDeletedHandler` が実装されていない場合、ローカルデータは自動的に消去されます。消去する前にローカルデータのコピーを維持するか、ローカルデータを維持する場合は、`AWSCognitoDatasetDeletedHandler` を実装します。

クライアントレベルでデータセットが削除されたハンドラを設定することができます。

```
client.datasetDeletedHandler = {
      (datasetName: String!) -> Bool in
      // make a backup of the data if you choose
      ...
      // delete the local data (default behaviour)
      return true
}
```

または、データセットレベルで設定できます。

```
dataset.datasetDeletedHandler = {
      (datasetName: String!) -> Bool in
      // make a backup of the data if you choose
      ...
      // delete the local data (default behaviour)
      return true
}
```

**データセットの結合ハンドラ**

以前に接続されていない 2 つの ID がリンクされ、すべてのデータセットが結合されます。アプリケーションは、`DatasetMergeHandler` メソッドを通じて結合について通知されます。ハンドラは、ルートデータセットの名前と、ルートデータセットの結合としてマーキングされているデータセット名の配列を受け取ります。

`DatasetMergeHandler` が実装されていない場合、これらのデータセットは無視されますが、ID の最大 20 個の合計データセットで引き続き領域を占有します。

クライアントレベルでデータセット結合ハンドラをセットアップすることもできます。

```
client.datasetMergedHandler = {
    (datasetName: String!, datasets: [AnyObject]!) -> Void in
    for nameObject in datasets {
        if let name = nameObject as? String {
            let merged = AWSCognito.defaultCognito().openOrCreateDataset(name)
            merged.clear()
            merged.synchronize()
        }
    }
}
```

または、データセットレベルで設定できます。

```
dataset.datasetMergedHandler = {
    (datasetName: String!, datasets: [AnyObject]!) -> Void in
    for nameObject in datasets {
        if let name = nameObject as? String {
            let merged = AWSCognito.defaultCognito().openOrCreateDataset(name)
            // do something with the data if it differs from existing dataset
              ...
              // now delete it
            merged.clear()
            merged.synchronize()
        }
    }
}
```

## JavaScript
<a name="handling-callbacks-1.javascript"></a>

**同期のコールバック**

データセットで synchronize() を実行するときに、オプションで次の各状態を処理するコールバックを指定できます。

```
dataset.synchronize({

   onSuccess: function(dataset, newRecords) {
      //...
   },

   onFailure: function(err) {
      //...
   },

   onConflict: function(dataset, conflicts, callback) {
      //...
   },

   onDatasetDeleted: function(dataset, datasetName, callback) {
      //...
   },

  onDatasetMerged: function(dataset, datasetNames, callback) {
      //...
  }

});
```

**onSuccess()**

`onSuccess()` コールバックは、同期ストアから正常にデータセットを更新したときにトリガーされます。コールバックを定義しない場合、同期はユーザーの操作なしに成功します。

```
onSuccess: function(dataset, newRecords) {
   console.log('Successfully synchronized ' + newRecords.length + ' new records.');
}
```

**onFailure()**

`onFailure()`は、同期中に例外が発生した場合に呼び出されます。コールバックを定義しない場合、同期はユーザーの操作なしに失敗します。

```
onFailure: function(err) {
   console.log('Synchronization failed.');
   console.log(err);
}
```

**onConflict()**

ローカルストアと同期ストアで同じキーが変更された場合に、競合が発生する可能性があります。`onConflict()` メソッドは、競合の解決を処理します。このメソッドを実行しない場合、競合があると同期は破棄されます。

```
onConflict: function(dataset, conflicts, callback) {

   var resolved = [];

   for (var i=0; i<conflicts.length; i++) {

      // Take remote version.
      resolved.push(conflicts[i].resolveWithRemoteRecord());

      // Or... take local version.
      // resolved.push(conflicts[i].resolveWithLocalRecord());

      // Or... use custom logic.
      // var newValue = conflicts[i].getRemoteRecord().getValue() + conflicts[i].getLocalRecord().getValue();
      // resolved.push(conflicts[i].resovleWithValue(newValue);

   }

   dataset.resolve(resolved, function() {
      return callback(true);
   });

   // Or... callback false to stop the synchronization process.
   // return callback(false);

}
```

**onDatasetDeleted()**

データセットが削除されると、Amazon Cognito クライアントは `onDatasetDeleted()` コールバックを使用して、データセットのローカルキャッシュコピーも削除されるべきかどうかを確認します。デフォルトでは、データセットは削除されません。

```
onDatasetDeleted: function(dataset, datasetName, callback) {

   // Return true to delete the local copy of the dataset.
   // Return false to handle deleted datasets outside the synchronization callback.

   return callback(true);

}
```

**onDatasetMerged()**

以前に接続されていない 2 つの ID がリンクされ、すべてのデータセットが結合されます。アプリケーションは、`onDatasetsMerged()` コールバックを通じて結合について通知されます。

```
onDatasetMerged: function(dataset, datasetNames, callback) {

   // Return true to continue the synchronization process.
   // Return false to handle dataset merges outside the synchronization callback.

   return callback(false);

}
```

## Unity
<a name="handling-callbacks-1.unity"></a>

データセットを開くか作成した後は、別のコールバックを設定できます。これは、Synchronize メソッドを使用したときにトリガーされます。この方法により、コールバックを登録することができます。

```
dataset.OnSyncSuccess += this.HandleSyncSuccess;
dataset.OnSyncFailure += this.HandleSyncFailure;
dataset.OnSyncConflict = this.HandleSyncConflict;
dataset.OnDatasetMerged = this.HandleDatasetMerged;
dataset.OnDatasetDeleted = this.HandleDatasetDeleted;
```

`SyncSuccess` と `SyncFailure` は、\$1= を = の代わりに使用し、複数のコールバックをサブスクライブできるようにします。

**OnSyncSuccess**

`OnSyncSuccess` コールバックは、クラウドから正常にデータセットを更新したときにトリガーされます。コールバックを定義しない場合、同期はユーザーの操作なしに成功します。

```
private void HandleSyncSuccess(object sender, SyncSuccessEvent e)
{
    // Continue with your game flow, display the loaded data, etc.
}
```

**OnSyncFailure**

`OnSyncFailure`は、同期中に例外が発生した場合に呼び出されます。コールバックを定義しない場合、同期はユーザーの操作なしに失敗します。

```
private void HandleSyncFailure(object sender, SyncFailureEvent e)
{
    Dataset dataset = sender as Dataset;
    if (dataset.Metadata != null) {
        Debug.Log("Sync failed for dataset : " + dataset.Metadata.DatasetName);
    } else {
        Debug.Log("Sync failed");
    }
    // Handle the error
    Debug.LogException(e.Exception);
}
```

**OnSyncConflict**

ローカルストアと同期ストアで同じキーが変更された場合に、競合が発生する可能性があります。`OnSyncConflict` コールバックは競合の解決を処理します。このメソッドを実行しない場合、競合があると同期は破棄されます。

```
private bool HandleSyncConflict(Dataset dataset, List < SyncConflict > conflicts)
{
  if (dataset.Metadata != null) {
    Debug.LogWarning("Sync conflict " + dataset.Metadata.DatasetName);
  } else {
    Debug.LogWarning("Sync conflict");
  }
  List < Amazon.CognitoSync.SyncManager.Record > resolvedRecords = new List < Amazon.CognitoSync.SyncManager.Record > ();
  foreach(SyncConflict conflictRecord in conflicts) {
    // SyncManager provides the following default conflict resolution methods:
    //      ResolveWithRemoteRecord - overwrites the local with remote records
    //      ResolveWithLocalRecord - overwrites the remote with local records
    //      ResolveWithValue - to implement your own logic
    resolvedRecords.Add(conflictRecord.ResolveWithRemoteRecord());
  }
  // resolves the conflicts in local storage
  dataset.Resolve(resolvedRecords);
  // on return true the synchronize operation continues where it left,
  //      returning false cancels the synchronize operation
  return true;
}
```

**OnDatasetDeleted**

データセットが削除されると、Amazon Cognito クライアントは `OnDatasetDeleted` コールバックを使用して、データセットのローカルキャッシュコピーも削除されるべきかどうかを確認します。デフォルトでは、データセットは削除されません。

```
private bool HandleDatasetDeleted(Dataset dataset)
  {
      Debug.Log(dataset.Metadata.DatasetName + " Dataset has been deleted");
      // Do clean up if necessary
      // returning true informs the corresponding dataset can be purged in the local storage and return false retains the local dataset
      return true;
  }
```

**OnDatasetMerged**

以前に接続されていない 2 つの ID がリンクされ、すべてのデータセットが結合されます。アプリケーションは、`OnDatasetsMerged` コールバックを通じて結合について通知されます。

```
public bool HandleDatasetMerged(Dataset localDataset, List<string> mergedDatasetNames)
{
    foreach (string name in mergedDatasetNames)
    {
        Dataset mergedDataset = syncManager.OpenOrCreateDataset(name);
        //Lambda function to delete the dataset after fetching it
        EventHandler<SyncSuccessEvent> lambda;
        lambda = (object sender, SyncSuccessEvent e) => {
            ICollection<string> existingValues = localDataset.GetAll().Values;
            ICollection<string> newValues = mergedDataset.GetAll().Values;

            //Implement your merge logic here

            mergedDataset.Delete(); //Delete the dataset locally
            mergedDataset.OnSyncSuccess -= lambda; //We don't want this callback to be fired again
            mergedDataset.OnSyncSuccess += (object s2, SyncSuccessEvent e2) => {
                localDataset.Synchronize(); //Continue the sync operation that was interrupted by the merge
            };
            mergedDataset.Synchronize(); //Synchronize it as deleted, failing to do so will leave us in an inconsistent state
        };
        mergedDataset.OnSyncSuccess += lambda;
        mergedDataset.Synchronize(); //Asnchronously fetch the dataset
    }

    // returning true allows the Synchronize to continue and false stops it
    return false;
}
```

## Xamarin
<a name="handling-callbacks-1.xamarin"></a>

データセットを開くか作成した後は、別のコールバックを設定できます。これは、Synchronize メソッドを使用したときにトリガーされます。この方法により、コールバックを登録することができます。

```
dataset.OnSyncSuccess += this.HandleSyncSuccess;
dataset.OnSyncFailure += this.HandleSyncFailure;
dataset.OnSyncConflict = this.HandleSyncConflict;
dataset.OnDatasetMerged = this.HandleDatasetMerged;
dataset.OnDatasetDeleted = this.HandleDatasetDeleted;
```

`SyncSuccess` と `SyncFailure` は、\$1= を = の代わりに使用し、複数のコールバックをサブスクライブできるようにします。

**OnSyncSuccess**

`OnSyncSuccess` コールバックは、クラウドから正常にデータセットを更新したときにトリガーされます。コールバックを定義しない場合、同期はユーザーの操作なしに成功します。

```
private void HandleSyncSuccess(object sender, SyncSuccessEventArgs e)
{
    // Continue with your game flow, display the loaded data, etc.
}
```

**OnSyncFailure**

`OnSyncFailure`は、同期中に例外が発生した場合に呼び出されます。コールバックを定義しない場合、同期はユーザーの操作なしに失敗します。

```
private void HandleSyncFailure(object sender, SyncFailureEventArgs e)
{
    Dataset dataset = sender as Dataset;
    if (dataset.Metadata != null) {
        Console.WriteLine("Sync failed for dataset : " + dataset.Metadata.DatasetName);
    } else {
        Console.WriteLine("Sync failed");
    }
}
```

**OnSyncConflict**

ローカルストアと同期ストアで同じキーが変更された場合に、競合が発生する可能性があります。`OnSyncConflict` コールバックは競合の解決を処理します。このメソッドを実行しない場合、競合があると同期は破棄されます。

```
private bool HandleSyncConflict(Dataset dataset, List < SyncConflict > conflicts)
{
  if (dataset.Metadata != null) {
    Console.WriteLine("Sync conflict " + dataset.Metadata.DatasetName);
  } else {
    Console.WriteLine("Sync conflict");
  }
  List < Amazon.CognitoSync.SyncManager.Record > resolvedRecords = new List < Amazon.CognitoSync.SyncManager.Record > ();
  foreach(SyncConflict conflictRecord in conflicts) {
    // SyncManager provides the following default conflict resolution methods:
    //      ResolveWithRemoteRecord - overwrites the local with remote records
    //      ResolveWithLocalRecord - overwrites the remote with local records
    //      ResolveWithValue - to implement your own logic
    resolvedRecords.Add(conflictRecord.ResolveWithRemoteRecord());
  }
  // resolves the conflicts in local storage
  dataset.Resolve(resolvedRecords);
  // on return true the synchronize operation continues where it left,
  //      returning false cancels the synchronize operation
  return true;
}
```

**OnDatasetDeleted**

データセットが削除されると、Amazon Cognito クライアントは `OnDatasetDeleted` コールバックを使用して、データセットのローカルキャッシュコピーも削除されるべきかどうかを確認します。デフォルトでは、データセットは削除されません。

```
private bool HandleDatasetDeleted(Dataset dataset)
{
    Console.WriteLine(dataset.Metadata.DatasetName + " Dataset has been deleted");
    // Do clean up if necessary
    // returning true informs the corresponding dataset can be purged in the local storage and return false retains the local dataset
    return true;
}
```

**OnDatasetMerged**

以前に接続されていない 2 つの ID がリンクされ、すべてのデータセットが結合されます。アプリケーションは、`OnDatasetsMerged` コールバックを通じて結合について通知されます。

```
public bool HandleDatasetMerged(Dataset localDataset, List<string> mergedDatasetNames)
{
    foreach (string name in mergedDatasetNames)
    {
        Dataset mergedDataset = syncManager.OpenOrCreateDataset(name);

            //Implement your merge logic here

        mergedDataset.OnSyncSuccess += lambda;
        mergedDataset.SynchronizeAsync(); //Asnchronously fetch the dataset
    }

    // returning true allows the Synchronize to continue and false stops it
    return false;
}
```