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?
 
     
     
    