I'm writing a simple "todo - helloworld" with jqueryMobile + knockout + breeze + WebAPI to learn about SPAs (Single Page Application) in a mobile context (unreliable internet connection)
To enable offline usage the WebApp will leverage
- Application Cache
- Localstorage
The App should use whenever possible remote database for loading and saving data, but should be able to seamlessly switch to localstorage when offline and synchronize local/remote changes when back online.
Now back to the question: the App will use Breeze's EntityManager for managing data (local cache and remote sync)
- "remoteDb"
To mitigate inconsistency/concurrency problems I would use 2 localstorage Keys:
- "localDb" for a local copy of the remote database (list of todos)
- "localPendingChanges" for changes the App wasn't able to submit to the remote database
so the flow would more or less be (pseudocode):
LoadData
if(online)
load remoteDb
save localDb // save a local copy of the fresh loaded remotDb
if(localPendingChanges)
load localPendingChanges // we are merging in the Breeze entityManager remote data with localPendingChanges
Savedata // we are online and we have pending changes, so we should sync everything back to the remoteDb as soon as possible
if(offline)
load localDb
if(localPendingChanges)
load localPendingChanges // we are merging in the Breeze entityManager local data with localPendingChanges
SaveData
if(online)
save remoteDb
clear localPendingChanges // until we are online there is no need to keep localPendingChanges
LoadData // we are loading data from remoteDb to update our localDb to the latest version
if(offline)
save localPendingChanges // we are saving only the changes to localstorage
What do you think about this approach? Is it a mess? Is it ok? What about concurrency problems in a multi user scenario?