DataStore events
DataStore periodically publishes state notifications onto Amplify's Hub. You can subscribe to the Hub to gain insight into the internal state of the DataStore. Events are published when:
- Your device loses or regains network connectivity;
- Data is synchronized with the Cloud;
- There are new, pending changes that have not yet been synchronized.
The following DataStore events are defined:
networkStatus
Dispatched when DataStore starts and every time network status changes
HubPayload NetworkStatusEvent
contains:
active
(Bool): true if the DataStore is on a network that can connect the Cloud; false, otherwise
subscriptionsEstablished
Dispatched when DataStore has finished establishing its subscriptions to all models
HubPayload: N/A
syncQueriesStarted
Dispatched when DataStore is about to perform its initial sync queries
HubPayload syncQueriesStartedEvent
contains:
models
([String]): an array of each model'sname
modelSynced
Dispatched once for each model after the model instances have been synced from the cloud
HubPayload modelSyncedEvent
contains:
modelName
(String): the name of the model that was syncedisFullSync
(Bool):true
if the model was synced with a "full" query to retrieve all modelsisDeltaSync
(Bool):true
if the model was synced with a "delta" query to retrieve only changes since the last syncadded
(Int): the number of new model instances added to the local storeupdated
(Int): the number of existing model instances updated in the local storedeleted
(Int): the number of model instances deleted from the local store
syncQueriesReady
Dispatched when all models have been synced from the cloud
HubPayload: N/A
ready
Dispatched when DataStore as a whole is ready, at this point all data is available
HubPayload: N/A
outboxMutationEnqueued
Dispatched when a local change has been newly staged for synchronization with the Cloud
HubPayload outboxMutationEvent
contains:
modelName
(String): the name of the model that is awaiting publication to the Cloudelement
:model
(Model): the model instance that will be published
outboxMutationProcessed
Dispatched when a local change has finished synchronization with the Cloud and is updated locally
HubPayload outboxMutationEvent
contains:
modelName
(String): the name of the model that has finished processingelement
:model
(Model): the model instance that is processed_version
(Int): version of the model instance_lastChangedAt
(Int): last change time of model instance (unix time)_deleted
(Bool): true if the model instance has been deleted in Cloud
outboxMutationFailed
Dispatched when publishing a mutation fails
HubPayload outboxMutationFailed
contains:
modelName
(String): the name of the model that failed to publishelement
:model
(Model): the model instance that failed to publisherrorType
(MutationErrorType): error type that occurredoperation
(MutationType): type of mutation that failed
outboxStatus
Dispatched when:
- the DataStore starts
- each time a local mutation is enqueued into the outbox
- each time a local mutation is finished processing
HubPayload OutboxStatusEvent
contains:
isEmpty
(Bool): a boolean value indicating that there are no local changes still pending upload to the Cloud
Usage
To see if the network status is active, you could set up the following listener:
Amplify.Hub.subscribe( HubChannel.DATASTORE, hubEvent -> DataStoreChannelEventName.NETWORK_STATUS.toString().equals(hubEvent.getName()), hubEvent -> { NetworkStatusEvent event = (NetworkStatusEvent) hubEvent.getData(); Log.i("MyAmplifyApp", "User has a network connection: " + event.getActive()); });
Amplify.Hub.subscribe(HubChannel.DATASTORE, { it.name.equals(DataStoreChannelEventName.NETWORK_STATUS.toString()) }, { val networkStatus = it.data as NetworkStatusEvent Log.i("MyAmplifyApp", "User has a network connection? ${networkStatus.active}") })
Amplify.Hub.subscribe(DATASTORE) { it.name == NETWORK_STATUS.toString() } .collect { val event = it.data as NetworkStatusEvent Log.i("MyAmplifyApp", "User has a network connection: ${event.active}") }
RxAmplify.Hub.on(HubChannel.DATASTORE) .filter(hubEvent -> DataStoreChannelEventName.NETWORK_STATUS.toString().equals(hubEvent.getName())) .subscribe(hubEvent -> { NetworkStatusEvent event = (NetworkStatusEvent) hubEvent.getData(); Log.i("MyAmplifyApp", "User has a network connection: " + event.getActive()); });