Conflict resolution
If data synchronization is enabled via AppSync, there can be different versions of the same object on the client and server. Multiple clients may have updated their respective copies of an object. DataStore will converge different object versions by applying conflict detection and resolution strategies. The default resolution is called Auto Merge
. This strategy allows collections to grow, and prefers server-side versions of single-field data. Other strategies include Optimistic Concurrency
control and Custom Lambda
functions. For more information, see the AWS AppSync documentation on conflict handling.
Custom conflict resolution
To select a different conflict resolution strategy, navigate into your project from a terminal and run amplify update api
. Choose Conflict resolution strategy to change the conflict detection and resolution strategies.
? Please select from one of the below mentioned services: `GraphQL`...? Select a setting to edit `Conflict resolution strategy`? Select the default resolution strategy Auto Merge❯ Optimistic Concurrency Custom Lambda Learn More
Per model configuration
Note that this flow will also allow you to change the strategy on each individual GraphQL type, though it is recommended to use the same strategy for your whole schema unless you have an advanced use case:
? Do you want to override default per model settings? Yes? Select the models from below:❯◉ Post ◯ PostEditor ◯ User
? Select the resolution strategy for Post model Custom Lambda? Select from the options below (Use arrow keys)❯ Create a new Lambda Function Existing Lambda Function
Custom configuration
DataStore has a few optional configurations, such as the ability to specify a custom handler for error messages that take place in any part of the system.
Finally you can configure the number of records to sync as an upper bound on items (per-Model) which will be stored locally on the device, as well as a custom interval in minutes which is an override of the default 24 hour "base query" which runs as part of the Delta Sync process.
Custom configuration fields
errorHandler
- handler function executed when Datastore encounters an unhandled error during its background operations.conflictHandler
- handler function when there is a conflict between two local and remote model instances in a sync operation.syncMaxRecords
- the maximum number of records to sync per execution.syncPageSize
- the page size of each sync execution.syncInterval
- the maximum interval (in seconds) for which the system will continue to perform delta queries. After this interval expires, the system performs a base query to retrieve all data.syncExpressions
- sets a set of sync expressions for a particular model to filter which data is synced locally. The expression is evaluated each time DataStore is started.authModeStrategy
- sets DataStore to enable or disable multiple authorization types.
Example
Future<void> initializeDataStoreWithConflictResolution() async { try { final datastorePlugin = AmplifyDataStore( modelProvider: ModelProvider.instance, errorHandler: ((error) { print('Custom ErrorHandler received: $error'); }), conflictHandler: (ConflictData data) { final localData = data.local; final remoteData = data.remote;
if (localData is Post && remoteData is Post) { final mergedPostData = Post( // always favor the title from the local Post data title: localData.title, rating: remoteData.rating, );
return ConflictResolutionDecision.retry(mergedPostData); }
return ConflictResolutionDecision.applyRemote(); }, // Sync configuration defaults: syncInterval: 86400, syncMaxRecords: 10000, syncPageSize: 1000, ); await Amplify.addPlugin(datastorePlugin);
await Amplify.configure(amplifyconfig); } on Exception catch (e) { safePrint('Error configuring Amplify: $e'); }}